Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4},
A solution set is:
(-1, 0, 1)
Note:
Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4},
A solution set is:
(-1, 0, 1)
(-1, -1, 2)
描述:在一个数组中找到3个数的和为0的所有集合。
解决思路:将数组sort后可以是的所有的元素为升序的。而后对于每一个元素nums[i],在其后的元素中求连个元素的和为-nums[i]。
(1)对于一个nums[i],可能有多个和为-nums[i]的组合。每次遍历的开始pointer为i+1,结束pointer为nums.size()-1.
(2)对于一个数nums[i],如果i>0&&nums[i]==nums[i-1],则和等于-nums[i]的情况已经处理,直接跳过。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
int target,left,right;
for(int i=0;i<nums.size();i++)
{
if(i>0&&nums[i] == nums[i-1])
continue;
target = -nums[i];
left = i+1;
right = nums.size()-1;
while(left < right)
{
int sum=nums[left]+nums[right];
if(sum==target)
{
vector<int>tmp;
tmp.push_back(nums[i]);
tmp.push_back(nums[left]);
tmp.push_back(nums[right]);
res.push_back(tmp);
while(++left<right&&nums[left]==nums[left-1]);//去掉重复的部分情况
while(left<--right&&nums[right]==nums[right+1]);
}
else if(sum<target)
{
left++;
}
else
{
right--;
}
}
}
return res;
}
};