class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//定义二维vector
vector<vector<int>>result;
//对nums从小到大排序
sort(nums.begin(),nums.end());
// 找出a + b + c = 0
// a = nums[i], b = nums[left], c = nums[right]
for(int i=0;i<nums.size();i++)
{
if(nums[i]>0)
{
return result;
}
// 错误去重方法,将会漏掉-1,-1,2 这种情况
/*
if (nums[i] == nums[i + 1]) {
continue;
}
*/
// 正确去重方法,对i去重处理
if(i>0&&nums[i]==nums[i-1])
{
continue;
}
//定义两个指针(用整形数表示)
int left = i+1;
int right = nums.size()-1;
while(left<right)
{
// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组
/*
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
*/
if(nums[i]+nums[left]+nums[right]>0)
{
right--;
//去重right
while(left<right&&nums[right]==nums[right+1])
{
right--;
}
}
else if(nums[i]+nums[left]+nums[right]<0)
{
left++;
//去重left
while(left<right&&nums[left]==nums[left-1])
{
left++;
}
}
else{
//当和为0时,将三个数放入容器result中
result.push_back(vector<int>{(nums[i]),nums[left],nums[right]});
// 去重逻辑应该放在找到一个三元组之后
while(left<right&&nums[left]==nums[left+1])
{
left++;
}
while(left<right&&nums[right]==nums[right-1])
{
right--;
}
//找到答案后,双指针同时收缩
left++;
right--;
}
}
}
return result;
}
};