一、介绍
1.题目描述
题目链接:https://leetcode-cn.com/problems/3sum/
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意事项:
- 答案中不可以包含重复的三元组。
2.测试样例
[-1,0,1,2,-1,-4] # [[-1,-1,2],[-1,0,1]]
[-1,0,2,0,1,-1,1,2,1] #
[] # []
0 # []
二、题解🟡
- 当数组长度 < 3,必然无解
- 重复结果不能输出,因此先进行排序,方便跳过重复解
- 每个解是一个三元组,存入 ans 中
1、问题转换为固定 a ,求解 b + c = -a 的两数之和问题。
2、由于已经对数组排过序,因此双指针指向头(i+1)和尾(n-1)
3、如果和小于目标,头后移,反之尾前移
4、对于前向遍历来说,如果当前数=前一个数,说明已经得过对应解,跳过避免重复
5、对于后向遍历来说,如果当前数=后一个数,说明已经得过对应解,跳过避免重复
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n=nums.size();
vector<vector<int>> ans;
if(n<3) return ans;
// 排序
sort(nums.begin(),nums.end());
for(int i=0;i<n;i++){
// 与前一个数值相同,跳过避免重复
if(i>0&&nums[i]==nums[i-1]) continue;
int t=nums[i];
// a = t,求解 b + c = - t,从数组下标 i + 1 遍历到下标 n - 1
int l=i+1,r=n-1,s=-t;
while(l<r){
if(nums[l]+nums[r]==s) {
ans.push_back({t,nums[l],nums[r]});
// 与前一个数值相同,跳过避免重复
while(l<r&&nums[l]==nums[l+1]) l++;
l++;
// 与后一个数值相同,跳过避免重复
while(l<r&&nums[r]==nums[r-1]) r--;
r--;
}
else if(nums[l]+nums[r]<s) l++;
else r--;
}
}
return ans;
}
};

该博客详细介绍了如何解决LeetCode上的三数之和问题,通过排序数组并使用双指针技巧避免重复解,有效地找到所有和为0的不重复三元组。具体步骤包括数组预处理、固定一个元素寻找其他两个数的和,以及在遍历过程中处理重复元素的策略。
2435

被折叠的 条评论
为什么被折叠?



