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