给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解析:寻找三个数相加为0的组合,如果数组是无序的,怎样都会很麻烦,因此第一步将数组排序。
对数组进行遍历,将题目转换为,寻找两个相加等于另一个值的数字。而寻找两个数字,自然可以想到使用双指针法。
问题在于解决重复集合,例如 -1,-1,-1, 2 这样的数组,会产生两个{-1,-1,2}结果。
一种可行且通用的解决方法是将结果先放入set中,利用set中元素不重复的特点自行去重,然后再次输出,这样虽然简单通用,但是空间时间利用率都不高。
另一种方法从算法入手,在获取到一种可行的结果后进行判断,主动去除重复的可能,节省了空间和时间。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
int i=0,j=0,k=0,sum=0;
for(;i<nums.size();++i){
if(nums[i]>0) break;
if(i>0&&nums[i]==nums[i-1]) continue;
sum = nums[i]*-1;
j = i+1;
k = nums.size()-1;
while(j<k){
if(nums[j]+nums[k]==sum){
res.push_back({nums[i],nums[j],nums[k]});
while(nums[j]==nums[j+1]&&j+1<k) ++j;
while(nums[k]==nums[k-1]&&j<k-1) --k;
++j;
--k;
}
else if(nums[k]+nums[j]>sum)
k--;
else
j++;
}
}
return res;
}
};