类似于2Sum做法,复杂度是O(n^2),难点在于如何去重三元组。
每次遇到符合的三元组,push_back进vector以后,还要继续往下扫,还有没有符合的,但是往下扫的时候记得跳过相同的元素。
附上K-Sum:求和问题总结的链接http://tech-wonderland.net/blog/summary-of-ksum-problems.html
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
sort(num.begin(), num.end());
vector<vector<int> > ans;
vector<int> v;
for(int i = 0; i < num.size() && num[i] <= 0; i++){
if(i >= 0 && num[i] == num[i-1]){
continue;
}
int p = i+1, q = num.size()-1, cur = -num[i];
while(p < q){
if(p == i || num[p] + num[q] < cur){
p++;
}
else if(q == i || num[p] + num[q] > cur){
q--;
}
else if(num[p] + num[q] == cur){
int n1 = num[i], n2 = num[p], n3 = num[q];
if(n1 > n2){
swap(n1, n2);
}
v.push_back(n1);
v.push_back(n2);
v.push_back(n3);
ans.push_back(v);
v.clear();
while(p < q && num[p+1] == num[p]){
p++;
}
while(q > p && num[q-1] == num[q]){
q--;
}
p++;
}
}
}
return ans;
}
};