题目:给定一个数组,求三个数字之和等于0的解集。(数字可能重复,且未排序)。
分析:与2sum相比,3sum只是要求数字,不是下标。因此可以考虑采用排序后,确定一个数,剩下两个数用前后夹击方法。
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num){
vector<vector<int> > res;
vector<int> tmp;
sort(num.begin(),num.end());//先排序。
for(int i=0;i<num.size();++i){//两层循环
if(num[i]>0)
break;
int start=i+1,end=num.size()-1;
while(start<end){
if(num[start]+num[end]>-num[i])
end--;//和太大,
else if(num[start]+num[end]<-num[i])
start++;//和太小
else {
tmp.push_back(num[i]);
tmp.push_back(num[start]);
tmp.push_back(num[end]);
vector<vector<int> >::iterator iter;
iter=find(res.begin(),res.end(),tmp);
if(iter==res.end())//去重的一个方法
res.push_back(tmp);
tmp.clear();
start++;
end--;//更新start和end。
}
}
}
return res;
}
};