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] ]
首先排序数组,然后固定一个数,再从后面的数中选择两个数,这两个数的和是第一个数的相反数。由于后面的数是排序好的,所以可以用双指针遍历所有情况。但是有可能会有一些重复的项,这里为了简单,直接用set。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
if(nums.size() <3) return {};
sort(nums.begin(),nums.end());
set<vector<int>> res;
for(int i=0; i<nums.size()-2; ++i){
if(i>0 && nums[i] == nums[i-1]) continue;
if(nums[i] >0) break;
int target = 0-nums[i];
int left = i+1, right = nums.size()-1;
while(left<right){
int n = nums[left]+nums[right];
if(n<target) ++left;
else if(n>target) --right;
else {
res.insert({nums[i],nums[left],nums[right]});
++left, --right;
}
}
}
return vector<vector<int>>(res.begin(),res.end());
}
};