简单有效方法:双指针
先将nums排序,比如示例1
nums->[-4 ,-1, -1, 0, 1, 2] i指向第一个 left指向i后第一个 right指向最后一个
如果nums[left]+nums[right] - nums[i]==0 那么就可以puch_back进入数组
如果nums[left]+nums[right] - nums[i]<0 left++
如果nums[left]+nums[right] - nums[i]>0 right--
还有个重要的去重操作
puch_back进入数组后需要将left 和 right去重
left++ , right--;
while( left<right &&nums[left] == nums[left-1]) left++;
while( left<right &&nums[right] == nums[right+1]) right--;
之后还需将i去重
i++;
while( i<nums.size() && nums[i]==nums[i-1]) i++;
完整代码如下
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();)
{
if(nums[i]>0)
{
break;
}
int left=i+1;
int right=nums.size()-1;
int target= - nums[i];
while(left<right)
{
int sum=nums[left]+nums[right];
if(sum>target)
{
right--;
}
else if(sum<target)
{
left++;
}
else
{
result.push_back({nums[i],nums[left],nums[right]});
left++,right--;
//去重
while(left<right &&nums[left] == nums[left-1]) left++;
while(left<right &&nums[right] == nums[right+1]) right--;
}
}
//去重 i
i++;
while(i<nums.size() && nums[i]==nums[i-1]) i++;
}
return result;
}
};