您的位置:首页 > 其它

3Sum

2016-05-16 14:11 337 查看
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.
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;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: