问题描述:
- 给定一个整数数组,返回和为
0
的所有不重复三元组。
核心思路:
- 该题是三数之和问题。
- 仍然是双指针的基础应用题,首先要排序数组,接着固定一个位置,用双指针解决剩下两个数的两数之和问题。
- 关键在于结果的去重:
- 第一步去重在外层循环中
i
的遍历,如果 nums[i] == nums[i-1]
,则直接跳过。【此步去重生效是因为已经将数组排序】 - 第二步去重在三元组满足条件时,需要同时移动双指针
j
和 k
,此时就需要将 j
指针跳过其右侧所有相等的数,还需要将 k
指针跳过其左侧所有相等的数。
代码实现:
class Solution
{
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
int m = nums.size();
if(m <= 2) return {};
vector<vector<int>> ss;
sort(nums.begin(), nums.end());
for(int i = 0; i < m-2; ++i)
{
if(i > 0 and nums[i] == nums[i-1]) continue;
int j = i+1, k = m-1;
int target = -nums[i];
while(j < k)
{
int sum = nums[j] + nums[k];
if(sum == target)
{
ss.push_back({nums[i], nums[j], nums[k]});
while(j < k and nums[j] == nums[j+1]) ++j;
while(j < k and nums[k] == nums[k-1]) --k;
++j, --k;
}
else if(sum > target) --k;
else ++j;
}
}
return ss;
}
};