15. 3Sum

Given an array S of n integers, are there elements abc in S 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.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>>ans;
        int n=nums.size();
        for(int i=0;i<n-2;i++){
            if(i&&nums[i]==nums[i-1])continue;//跳过重复值
            int low=i+1,high=n-1,mid,sum=-nums[i];//Two-Sum problem
            while(low<high){
                if(nums[low]+nums[high]==sum){
                    ans.push_back({nums[i],nums[low],nums[high]});//find one
                    while(low<high&&nums[low]==nums[low+1])low++;
                    while(low<high&&nums[high]==nums[high-1])high--;
                    low++,high--;
                }
                else if(nums[low]+nums[high]<sum){
                    while(low<high&&nums[low]==nums[low+1])low++;
                    low++;
                }
                else {
                      while(low<high&&nums[high]==nums[high-1])high--;
                      high--;
                }
            }
        }
        return ans;
    }
};

 

posted @ 2017-04-04 14:10  Tsunami_lj  阅读(106)  评论(0编辑  收藏  举报