先判断数组数量是否大于3
然后给数组排序,判断前三个数的和是否大于0,如果大于,则return
设置i为三元组的第一个数,l为第二个,r为第三个
从0开始遍历i,l=i+1,r=num.size()-1
然后判断三个数的和--x,当大于0,将r--,小于0,将l++,等于0,l++, r--
删除重复的三元组:----->>当x==0时,如果num[l+1] == num[l],将l++,如果num[r-1]==num[r],将r--;同时,每次遍历开始时如果num[i]==num[i-1],就跳过当前遍历,进入下一轮遍历
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > res;
if(num.size() < 3)
return res;
sort(num.begin(), num.end());
if(num[0] + num[1] + num[2] > 0)
return res;
for(int i = 0; i < num.size() - 2; i++) {
if(num[i] > 0)
break;
if(i && num[i] == num[i-1])
continue;
for(int l = i + 1, r = num.size() - 1; l < r;) {
vector<int> ans;
int x = num[i] + num[l] + num[r];
if(x < 0)
l++;
else if(x > 0)
r--;
else {
ans.push_back(num[i]);
ans.push_back(num[l]);
ans.push_back(num[r]);
res.push_back(ans);
while(num[l] == num[l+1] && l + 1 < r) l++;
while(num[r] == num[r-1] && r - 1 > l) r--;
l++;
r--;
}
}
}
return res;
}