leedcode 3Sum

题意: 就是给一个数组,然你求出里面 3个数和为0的 组合,然后存在vector里返回,数字可以不连续

1.如果n3复杂度肯定不行,所以用n2的复杂度,固定一个数,然后求那两个数的和等于第一个确定的数的负数即可,当然先按照升序排好,注意vector的排序方法,用.begin(),.end()

2.用两指针思路,在固定一个的同时,两个指针一个从前一个从后像内缩,指导两个指针碰上。 

3.一个非常重要的错误!!!!

下面是正确的代码,用的for循环

class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        sort(num.begin(),num.end());
        vector<vector<int> > result;
        if(num.size()<3)
            return result;
        for(int i = 0;i < num.size()-1;i++){
            if(i!=0 && num[i] ==num[i-1]) continue;
            int j = i + 1, k = num.size()-1;
            int sum;
            while(j < k){
                sum = num[i] + num[j] + num[k];
                if(sum== 0) {
                        vector<int> one;
                        one.push_back(num[i]);
                        one.push_back(num[j]);
                        one.push_back(num[k]);
                        result.push_back(one);
                        while(++j<k&&num[j]==num[j-1]){}
                        while(j<--k&&num[k]==num[k+1]){}
                }
                else if(sum <0) j++;
                else k--;
            }
        }
        return result;
    }
};
下面的是错误的代码,唯一不同的是while循环

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

卧槽,找了一个上午的问题,后来发现循环改成for就好使了,后来经高人指点,原来问题在于第一次判断
 if(i!=0 && num[i] ==num[i-1]) continue;
while循环完全等价于for循环,除非里面有continue的情况!!!!!!!也就是说如果有continue,就不加了,那循环就跑不动了

这回记忆深刻了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值