先排序,然后主循环穷举第一个数a可以的取值(保证至少剩下2个数)以sum-a 为新的sum, 以数组剩下的部分为新的数组,用两头夹逼法解决2Sum问题。主循环和夹逼的时候都要跳过重复的数。
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> output;
if(num.size()<3) return output;
sort(num.begin(),num.end());
for(int i=0;i<num.size()-2;i++)
{
if(i!=0 && num[i]==num[i-1])
continue;
int front = i+1,rear = num.size()-1;
while(front<rear)
{
int sum = num[i]+num[front]+num[rear];
if(sum==0)
{
output.push_back({num[i],num[front],num[rear]});
front++;rear--;
while(front<rear && num[front]==num[front-1])
front++;
while(front<rear && num[rear]==num[rear+1])
rear--;
}
else if(sum<0)
front++;
else
rear--;
}
}
return output;
}