首先需要将输入数组排序,大致思路就是i从数组头至尾循环一遍,循环内部求两数之和为-num[i]即可。需要注意的是为了避免出现重复结果,那么当当前数和取得上一个数相同的时候要跳过(注意边界)。在while循环中由于j和k的值会发生变化,也要及时判断是否达到了跳出条件。
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
sort( num.begin(),num.end() );
vector<vector<int> > res;
res.clear();
for( int i=0;i<num.size();i++ )
{
while( i>0 && num[i] == num[i-1] )
{
i++;
}
int j=i+1,k=num.size()-1;
while( j<k )
{
while( j>i+1 && num[j] == num[j-1] )
{
j++;
}
while( k<num.size()-1 && num[k] == num[k+1] )
{
k--;
}
if( j>= k )
{
break;
}
if( num[i]+num[j]+num[k] > 0 )
{
k--;
}
else if( num[i]+num[j]+num[k] < 0 )
{
j++;
}
else
{
vector<int> tmp;
tmp.push_back(num[i]);
tmp.push_back(num[j]);
tmp.push_back(num[k]);
res.push_back(tmp);
j++;
}
}
}
return res;
}
};