3sum
思路:
1.先排序sort(nums.begin(),num.end())
2.
if(nums[i]>0)break;只看小于0的部分,当大于0时停止循环
if(i>0 && nums[i]==nums[i-1])continue;如果遇到相同的数不计算,跳出当次循环,进入下一次循环
最终通过的代码如下,其中有个地方很纠结,就是总会有多出来的数组或者遗漏的数组。原因在while和if使用不当(见下面*)。之前一直用if,提交时总是会报错,不管怎么调换这两句的位置都不对,不是多了就是少了。比如测试数组[-5,-3,-2,0,0,0,1,1,1,3,3,4,4],总是会有两个[-5,1,4],[-5,1,4]出现,原因就是这两句用了if。区别就是如果用if,只能滤过第2个“1”,而改为while以后,第3个“1”(后面更多的相同数字)都可以滤掉了。这个是基础概念不扎实,反省一下,继续努力!
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<int> A;
vector<vector<int> >B;
sort(nums.begin(),nums.end());
int i;
int begin;
int end;
int sum;
for(i=0;i<nums.size();i++)
{
if(nums[i]>0){break;}
if((nums[i]==nums[i-1])&&(i>0)){continue;}
begin=i+1;
end=nums.size()-1;
while(begin<end)
{
sum=nums[i]+nums[begin]+nums[end];
if(sum==0)
{
A.push_back(nums[i]);
A.push_back(nums[begin]);
A.push_back(nums[end]);
B.push_back(A);
A.clear();
begin++;
end--;
while((nums[begin]==nums[begin-1])&&(begin<end)){begin++;}//*
while((nums[end]==nums[end+1])&&(begin<end)){end--;}//*
}
else if(sum<0)
{
begin++;
}
else
{
end--;
}
}
}
return B;
}
};