15.三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 _a + b + c = _0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
先将数组排序,固定一个数,将另两个数看为两数之和进行操作(使用双向指针)
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> result;
int n = nums.size();
for(int i=0;i<n;i++)
{
//如果第一个数都>0直接返回
if(nums[i]>0)
break;
//去重,从第二个数开始,若当前数与前一个数相同,则跳过
if(i>0 && nums[i]==nums[i-1])
continue;
//双指针
int left = i+1;
int right = n-1;
while(left<right)
{
if(left>=right)
break;
//若满足条件,则记录数据,并将指针收缩范围
if(nums[i]+nums[left]+nums[right]==0)
{
result.push_back(vector<int>{nums[i],nums[left],nums[right]});
left++;
right--;
//去重,若出现重复的数字就继续收缩
while(left<right && nums[left] == nums[left-1])left++;
while(left<right && nums[right] == nums[right+1])right--;
}
else if(nums[i]+nums[left]+nums[right]>0)
right--;
else
left++;
}
}
return result;
}
};