3Sum

来源:互联网 发布:网络推广博客 编辑:程序博客网 时间:2024/06/06 02:29
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;                    }};



0 0