三数之和
给你一个包含 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 = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
思路:本题要用排序+双指针算法来做,直接暴力肯定是会TLE的,因此最多只能枚举两轮。并且为了保证算法不会出现重复,必须要按顺序枚举,并且在确定第一个数之后,枚举剩下两个数时不能出现重复的数。
代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
if(nums.size()<3)
return ans;
sort(nums.begin(),nums.end());
if(nums[0]>0)
return ans;
int i=0;
while(i<nums.size()){
if(nums[i]>0)
break;
int l=i+1,r=nums.size()-1;
while(l<r){
int a1=nums[i];
int a2=nums[l];
int a3=nums[r];
if(a1+a2+a3>0)
r--;
else if(a1+a2+a3<0)
l++;
else{
ans.push_back({nums[i], nums[l], nums[r]});
while(l<r&&nums[l]==nums[l+1])
l++;
while(l<r&&nums[r]==nums[r-1])
r--;
l++;
r--;
}
}
while(i+1<nums.size()&&nums[i]==nums[i+1])
i++;
i++;
}
return ans;
}
};