题目描述:
给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。
注意:
三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)
解集中不能包含重复的三元组。
例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, 0, 10) (-10, -10, 20)
分析:
(1)先将数组进行排序(从小到大)。然后固定一个数,从后面的数中选出两个数,因为数组是有序的,所以可以使用两个数组下标left和right,left指向当前元素的后一个位置,right指向最后一个位置
(2)三个数相加的和等于0时,加入解集;
(3)小于0时,把left往右边移动;
(4) 大于0时,把right往左边移动;
class Solution {
public:
vector<vector > threeSum(vector &num) {
sort(num.begin(),num.end()) ;//将数组中的元素从小到大排序
vector<vector> ans;//定义一个存放结果的二位数组集合
for(int i=0;i<num.size();++i)//先依次取出一个数,转换为2个数求和问题
{
if(i==0||num[i]!=num[i-1])//防止元素重复
{
int left=i+1,right=num.size()-1;//定义两个头尾指针
while(left<right){
while(left<right&&num[i]+num[left]+num[right]>0)
right–;//right左移,减小num[right]的值
if(left<right&&num[i]+num[left]+num[right]==0)
{
vectortmp(3);
tmp[0]=num[i];
tmp[1]=num[left];
tmp[2]=num[right];
ans.push_back(tmp);//保存结果
while(left<right&&num[left]==tmp[1])
left++;
}
else//left<right&&num[i]+num[left]+num[right]<0的情况
{
left++;
}
}
}
}
return ans;
}
};