leetcode第一刷_3Sum

143 篇文章 0 订阅

估计大家都会做twoSum,一头一尾两个指针,跟据和的大小移动就行了。

3sum能不能用相同的方法呢,我尝试用暴力做,居然过了。思路是先把数组排个序,让相同数字的都靠在一起,然后固定一个数,其他两个数就按照twosum的那一套来,只不过计算sum的时候多算了一个数而已。需要注意一个问题,靠在一起一样的数,只能在第一次遇到它的时候用,更准确一点说,每个相同的数,只有一次作为i或j或k的机会,而且不用担心是不是会漏掉情况,如果数组是111,要求3,这不都用了吗,是的,但是是i,j,k各用了他们一次。表达的不是很好,看代码应该就明白了。这个解法太暴力,不优雅。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值