leedcode 3Sum

来源:互联网 发布:上海大学乐乎硬盘 编辑:程序博客网 时间:2024/06/06 16:33

题意: 就是给一个数组,然你求出里面 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,就不加了,那循环就跑不动了

这回记忆深刻了

0 0
原创粉丝点击