思想:
左右夹逼(先排序才能做)
时间复杂度O(max(n*logn , n^2))
最终要找到这样一组(i,j,k):target = num[i] + num[j] + num[k]
从0到last-1 循环i,然后j = i+1 ,k = last -1,开始左右夹逼,以此类推。
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> result;
if(num.size()<3)
return result;
sort(num.begin(),num.end());
const int target=0;
auto last=num.end();
for(auto i=num.begin();i<last-2;i++) {
if(i>num.begin() && *i == *(i-1)) continue;
auto j=i+1;
auto k=last-1;
while(j<k) {
if(*i+*j+*k < target) {
++j;
while( *j == *(j-1) && j<k) ++j;
}else if(*i+*j+*k > target) {
--k;
while( *k == *(k+1) && j<k) --k;
} else {
result.push_back({*i,*j,*k});
++j;
--k;
while(*j == *(j-1) && j<k) ++j;
while(*k == *(k+1) && j<k) --k;
}
}
}
return result;
}
};