3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is: (-1, 0, 1) (-1, -1, 2)
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > r;
int i, j, n = num.size();
bool flag = true;
sort(num.begin(),num.end());
for(int k = 0; k <= n - 3; k++) {
if(num[k] == num[k+1] && num[k+1] == num[k+2]) {
if(num[k] == 0 && flag) {
vector<int> a(3,0);
r.push_back(a);
flag = false;
}
else continue;
}
else if(num[k] == num[k+1]) {
for(i = k + 2; i <= n - 1; i++) {
if(num[i]+num[k]+num[k+1]==0) {
vector<int> a(3,0);
a[0] = num[k];
a[1] = num[k+1];
a[2] = num[i];
r.push_back(a);
break;
}
}
}
else {
i = k + 1;
j = n - 1;
while(i < j) {
if(num[i]+num[j]+num[k]==0) {
vector<int> a(3,0);
a[0] = num[k];
a[1] = num[i];
a[2] = num[j];
r.push_back(a);
while(num[i] == num[i+1]) {
i++;
}
i++;
}else if(num[i]+num[j]+num[k]<0) i++;
else j--;
}
}
}
return r;
}
};
思路:与 3Sum Closest 思路相似。但为避免出现重复答案,做了大量工作。