leetcode 3Sum

此题可以将问题一分为二,共有三个数,先确定一个数a,剩下的就是找到两个数的和为-a。

需要注意的是,因为题中给的一维数组中会有重复的数值出现,且最终要求集合中的元素是按照递增排列,因此,首先需要将一维数组排序且在搜索过程中去除重复的元素。


代码

class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        
        vector<vector<int> > res;
        int len = num.size();
        if(len<=2)
            return res;
            
        sort(num.begin(), num.end());
        
        for(int i = 0; i < len-2; ++i)
        {
            if(i>0&&num[i]==num[i-1])
                continue;
            threeSumHelper(res, num, i+1, 0-num[i]);
        }
        
        return res;
    }
    
    void  threeSumHelper(vector<vector<int> > &res, vector<int> &num, int start, int sum)
    {
        int left = start;
        int right = num.size()-1;
        
        while(left < right)
        {
            if(num[left]+num[right]==sum)
            {
                vector<int> tempRes;
                tempRes.push_back(num[start-1]);
                tempRes.push_back(num[left]);
                tempRes.push_back(num[right]);
                res.push_back(tempRes);
                
                int k = left+1;
                while(k<right&&num[k]==num[left])
                    ++k;
                left = k;
                
                k = right-1;
                while(k>left&&num[k]==num[right])
                    --k;
                right = k;
                
            }
            else if(num[left]+num[right]>sum)
                right--;
            else
                left++;
            
        }
        
        
        
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值