-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththree-sum.cpp
102 lines (88 loc) · 2.66 KB
/
three-sum.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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;
}