3sum

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: 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]
]

解:

很容易想到,可以遍历数组来充当triplet的第一个数字,剩下的数字就是找一个target-first的2sum问题,当数组排好序的时候2sum问题可以在O(N)的时间内解决(不包含排序的时间),方法就是两个指针从左右一同向中间扫,直到相遇为止。
注:当然2sum问题考虑到上面解法中排序的时间总的复杂度就是O(Nlog(N))了,利用hashtable的话可以实现O( N )的解法,但这里的3sum问题其实解法是O(N2)的,排序的时间就无所谓了。而且,两个指针扫的办法也容易解决重复triplet的问题


class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>>res;
        int len=nums.size();
        sort(nums.begin(),nums.end());
        for(int i=0;i<len-2;++i)
        {
            int sum=-nums[i];
            if(i==0|nums[i]!=nums[i-1])
            {
                int l=i+1;
                int r=len-1;
                while(l<r)
                {
                    if(nums[l]+nums[r]==sum)
                    {
                        res.push_back(vector<int>{nums[i],nums[l],nums[r]});
                        while(l<r&&nums[r-1]==nums[r])--r;
                        --r;
                        while(l<r&&nums[l+1]==nums[l])++l;
                        ++l;


                    }
                    else if(nums[l]+nums[r]>sum)
                    {
                        while(l<r&&nums[r-1]==nums[r])--r;
                        --r;
                    }
                    else 
                    {
                        while(l<r&&nums[l+1]==nums[l])++l;
                        ++l;
                    }

                }
            }

        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值