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)
|
- [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)
|
- [Move Zeros to End of The Array](Arrays/move-zeros-to-end-of-array.cpp)
|
||||||
- [Kadane's Algorithm](Arrays/Kadane's-Algorithm.cpp)
|
- [Kadane's Algorithm](Arrays/Kadane's-Algorithm.cpp)
|
||||||
|
- [All unique triplet that sum up to given value](Arrays/three-sum.cpp)
|
||||||
|
|
||||||
## Dynamic-Programming
|
## Dynamic-Programming
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue