15. 3Sum

来源:互联网 发布:视频广告过滤 知乎 编辑:程序博客网 时间:2024/06/08 19:01

题目:

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:

  • 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)


题意:

从给定的数组中找出所有三个数相加和为0的组合。组合需要满足 a ≤ b ≤ c。


思路:

先排序,然后左右夹逼,复杂度O(n2)。这个方法可以推广到k-sum,先排序,然后做k。

class Solution {public:    vector<vector<int>> threeSum(vector<int>& nums) {                vector<vector<int>> result;                if(nums.size()<3){            return result;        }                const int target = 0;        sort(nums.begin(), nums.end());                auto last = nums.end();        for(auto i=nums.begin(); i<last-2; i++){            auto j = i+1;            if(i>nums.begin() && *i==*(i-1))                continue;            auto k = last-1;            while(j<k){                if(*i+*j+*k<target){                    ++j;                    while(*j==*(j-1) && j<k)                        ++j;                }else if(*i+*j+*k>target){                    --k;                    while(*k==*(k+1) && j<k)                        --k;                }else{                    result.push_back({*i, *j, *k});                    ++j;                    --k;                    while(*j==*(j-1) && *k==*(k+1) && j<k)                        ++j;                }            }        }                return result;    }};

public class Solution {    public List<List<Integer>> threeSum(int[] nums) {                Arrays.sort(nums);                List<List<Integer>> result = new LinkedList<>();                for(int i=0; i<nums.length-2; i++){            if(i==0 || (i>0 && nums[i]!=nums[i-1])){                int j = i+1;                int k = nums.length-1;                int target = 0 - nums[i];                                while(j<k){                    if(nums[j]+nums[k]==target){                        result.add(Arrays.asList(nums[i], nums[j], nums[k]));                        while(j<k && nums[j]==nums[j+1])                            j++;                        while(j<k && nums[k]==nums[k-1])                            k--;                        j++;                        k--;                    }else if(nums[j]+nums[k]<target){                        j++;                    }else{                        k--;                    }                }            }        }                return result;    }}


0 0