chore(CPlusPlus): add three sum (#595)
Co-authored-by: Ming Tsai <37890026+ming-tsai@users.noreply.github.com>pull/612/head^2
parent
2dddebc516
commit
5098737c64
|
@ -0,0 +1,102 @@
|
|||
//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;
|
||||
|
||||
}
|
|
@ -25,7 +25,7 @@
|
|||
- [Index of Smallest element of Array](Arrays/index-of-smallest-element-of-array.cpp)
|
||||
- [Move Zeros to End of The Array](Arrays/move-zeros-to-end-of-array.cpp)
|
||||
- [Kadane's Algorithm](Arrays/Kadane's-Algorithm.cpp)
|
||||
|
||||
- [All unique triplet that sum up to given value](Arrays/three-sum.cpp)
|
||||
|
||||
## Dynamic-Programming
|
||||
|
||||
|
|
Loading…
Reference in New Issue