题目链接:
https://leetcode-cn.com/problems/3sum/
注意:
1.本题主要是数组去重这一块比较困难,比如-1,-1,-1,2这种情况,当遇到第一个-1的时候,如果直接判断后一个也等于-1的时候,就把index++,此时为-1,-1,2,由于此时还是满足前一个等于后一个,所以继续++,最后就变成了-1,2,那么此时就无法满足a+b+c=0了,所以这样的算法是不对的
2.正确的是第一次重复可以接受,但是第二次就不能接受。比如-1,-1,-1,2,第一次接受,所以找到了-1,-1,2。第二次到到第二个-1的时候,判断前一个是不是出现重复,如果是那么index++。所以最后就只剩下了2,也就无再满足了。
3.任何++,--的操作,都需要有限制,所以循环里面一直都出现了left<right,这一点不能忘记,如果没有这个限制,很可能最后right=left,但是按照题意,left只能小于right
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
if(nums.size()<3) return {};
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-2;i++){
//排序后如果某一次已经最小的都大于0,那肯定不行,直接返回result
if(nums[i]>0) return result;
//对i进行去重
if(i>0 &&(nums[i-1]==nums[i]))continue;
int left=i+1;
int right=nums.size()-1;
while(left<right){
int sum = nums[i]+nums[left]+nums[right];
if(sum==0){
result.push_back({nums[i], nums[left], nums[right]});
while(left<right && nums[right]==nums[right-1]) right--;
while(left<right && nums[left]==nums[left+1]) left++;
right--;
left++;
}else if(sum>0) right--;
else left++;
}
}
return result;
}
};