DSA/algorithms/CPlusPlus/Arrays/three-sum.cpp

103 lines
2.7 KiB
C++
Raw Normal View History

//Description :c++ solution to find all the unique triplet without using any extra space.
//using this method we will be able to find all the unique triplets
//Time Complexity : O(n), where n is the array size
//Space Complexity : O(1),it will take only constant amount of time.
//sample
// input 1: arr[]=[-1,0,1,2,-1,4]
//output 1:[[-1,0,1][-1,-1,2]]
//input 2:arr[]=[]
//output 2:[]
#include<bits/stdc++.h>
using namespace std;
void findTriplet(int arr[],int n,int sum) {
int i;
// Sort the input array
sort(arr, arr + n);
// For handling the cases when no such
// triplets exits.
bool flag = false;
// Iterate over the array from start to n-2.
for (i = 0; i < n - 2; i++)
{
if (i == 0 || arr[i] > arr[i - 1])
{
// Index of the first element in
// remaining range.
int start = i + 1;
// Index of the last element
int end = n - 1;
// Setting our new target
int target = sum - arr[i];
while (start < end)
{
// Checking if current element
// is same as previous
if (start > i + 1
&& arr[start] == arr[start - 1])
{
start++;
continue;
}
// Checking if current element is
// same as previous
if (end < n - 1
&& arr[end] == arr[end + 1])
{
end--;
continue;
}
// If we found the triplets then print it
// and set the flag
if (target == arr[start] + arr[end])
{
cout << "[" << arr[i]
<< "," << arr[start]
<< "," << arr[end] << "] ";
flag = true;
start++;
end--;
}
// If target is greater then
// increment the start index
else if (target > (arr[start] + arr[end]))
{
start++;
}
// If target is smaller than
// decrement the end index
else {
end--;
}
}
}
}
// If no such triplets found
if (flag == false) {
cout << "No Such Triplets Exist"
<< "\n";
}
}
int main()
{
// int arr[]={12,3,6,1,6,9};
int arr[]={-1,0,1,2,-1,-4};
int n=sizeof(arr)/sizeof(arr[0]);
int sum=0;
findTriplet(arr,n,sum);
return 0;
}