题目描述:
给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?找出所有满足条件并且不重复的三元组。
题目解析:
本题的实质类似于两数之和,比较简单,采用双指针的方式可以实现。但要主要去掉重复的元组。
具体思路:先对数组nums进行升序排列,然后再确定当前元素(cur),左右指针(left、right)双指针移动,找到满足nums[cur]=nums[right]+nums[right]条件的三元组。如果不满足,则使得指针左右移动即可。
class Solution{
public:
vector<vector<int>> threeSum(vector<int>& nums){
sort(nums.begin(),nums.end()); //对数组进行顺序排序
//降序排列的方式为:sort(nums.rbegin(),nums.rend())
int N = nums.size();
vector<vector<int>> res; //用来保存中间结果
if(N<=2) return res;
for(int i=0;i<N-2;i++) //进行下标索引所设置
{
int cur = nums[i]; //表示当前值
if(cur>0) break; //从第一个负值开始
int curNeg = 0-cur; //进行取反,为正数
int left = i+1, right = N-1;
while(left<right) //左指针小于右指针条件
{
int leftVal = nums[left], rightValue=nums[right];
if(leftValue+rightValue==curNeg)
{
vector<int> tmpVec{cur,leftValue,rightValue};
res.push_back(tmpVec); //把满足条件的数组进栈
//去除重复的三元组
while(left<right&&nums[left]==leftValue)
{
left++;
}
while(left<right&&nums[right]==rightValue)
{
right--;
}
}
else if(leftValue+rightValue<curNeg) left++;
else if(leftValue+rightValue>curNeg) right--;
//去重
while(i+1<N-2&&nums[i]==nums[i+1]) i++;
}
}
return res;
}
};