题目要求:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
本题比较难的是去重,由于我采用双指针法,所以要考虑3个因素的去重。
首先用循环遍历数组,然后定义a,b,c,a就为nums[i],b=nums[i+1],c=nums[nums.size()-1]。
然后定义左和右指针,左指针为left=i+1,右指针为right=nums.size()-1。
在遍历过程中,如果nums[i]+nums[left]+nums[right]>0,说明right过大,则right--;
nums[i]+nums[left]+nums[right]<0,说明left过小,则left--;
然后就是去重,第一个去重的是nums[i],第二个去重的是nums[left],第三个去重的是nums[rihgt]。
完整代码如下:
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();i++)
{
int left=i+1;
int right=nums.size()-1;
if(nums[i]>0)
continue;
if(i>0&&nums[i]==nums[i-1])
continue;
while(left<right)
{
if(nums[i]+nums[left]+nums[right]==0)
{
result.push_back(vector<int>{nums[i],nums[left],nums[right]});
while(left<right&&nums[right]==nums[right-1])
{
right--;
}
while(left<right&&nums[left]==nums[left+1])
{
left++;;
}
left++;
right--;
}
if(nums[i]+nums[left]+nums[right]>0)
{
right--;
}
if(nums[i]+nums[left]+nums[right]<0)
{
left++;
}
}
}
return result;
}
};