3Sum
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
解析
因为要去重,所以不能先固定一个数,用Two Sum的方法去找另外两个数。
先对数组进行排序,然后固定一个数,并且利用左右两个指针来找另外两个数。
当遇到某个数>0时,可以直接跳过,因为后面的数加起来不可能等于0,当前数与前面重复时,直接跳过。
如果找到两个数的和等于target=0-当前数,左右指针都要跳过重复的。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> > res;
int size = nums.size();
if(size<3)
return res;
sort(nums.begin(),nums.end());
for(int i=0;i<size;i++){
if(nums[i]>0)
break;
if(i>0 && nums[i]==nums[i-1])
continue;
int target = 0-nums[i];
int l = i+1,r = size-1;
while(l<r){
if(nums[l] + nums[r] == target){
res.push_back({nums[i],nums[l],nums[r]});
while(l<r && nums[l] == nums[l+1])
l++;
while(l<r && nums[r] == nums[r-1])
r--;
l++;
r--;
}
else if(nums[l] + nums[r] < target)
l++;
else
r--;
}
}
return res;
}
};