例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, -10, 20),(-10, 0, 10)
示例1
输入:
[0]
返回值:
[]
示例2
输入:
[-2,0,1,1,2]
返回值:
[[-2,0,2],[-2,1,1]]
示例3
输入:
[-10,0,10,20,-10,-40]
返回值:
[[-10,-10,20],[-10,0,10]]
Code:
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > res;
sort(num.begin(),num.end());
int midPos;
for(int i=0;i<num.size();i++)
{
if(num[i]>=0)
{
midPos=i;
break;
}
}
//主要是判断是否存在三个零(特殊情况)
if(midPos>=0)
{
if(num.size()>=3)
{
if(num[midPos]==0&&num[midPos+1]==0&&num[midPos+2]==0)
{
vector<int>temp;
temp.push_back(0);
temp.push_back(0);
temp.push_back(0);
res.push_back(temp);
}
}
}
int a,b,c;
vector<int>::iterator it;
for(int i=0;i<midPos;i++)
{
int itemp=1;
for(int j=midPos;j<num.size();j++)
{
int z=0-(num[i]+num[j]);
if((it=find(num.begin()+midPos+(itemp++),num.end(),z))!=num.end())
{
vector<int>temp;
temp.push_back(num[i]);
temp.push_back(num[j]);
temp.push_back(z);
res.push_back(temp);
}
}
}
for(int i=midPos;i<num.size();i++)
{
int itemp=1;
for(int j=0;j<midPos;j++)
{
int z=0-(num[i]+num[j]);
if((it=find(num.begin()+(itemp++),num.begin()+midPos,z))!=num.begin()+midPos)
{
vector<int>temp;
temp.push_back(num[i]);
temp.push_back(num[j]);
temp.push_back(z);
sort(temp.begin(),temp.end());
res.push_back(temp);
}
}
}
sort(res.begin(),res.end());
res.erase(unique(res.begin(), res.end()), res.end());
return res;
}
};