题目:三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]
输入:nums = [] 输出:[]
输入:nums = [0] 输出:[]
题解
双指针:
step1:对数组进行排序
step2:对已经排序对数组,进行遍历
step3:如果当前数组数量少于3,则返回空
step4:假设nums[i]已定,寻找另外的两个数字
step5:在找两个两个数字时,一个从L=i+1开始,一个从R=len-1开始,采用双指针
step6:如果三者之和等于0,则记录在结果中,此时需要注意的需要去重
在整个过程中,比较重要的一个是去重,涉及到的三个数字,均需要去重
nums[i]去重:nums[i] = nums[i-1]说明该数字,已经寻找过,直接跳过
nums[L] = nums[L+1]:找到满足条件的L后,需要对其进行去重,后面相等的数字,直接跳过
nums[R] = nums[R-1]:找到满足条件的R后,需要对其去重,前面有相等的数字,直接跳过
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
const ans = [];
const len = nums.length;
//如果数组不足三个数字,直接返回
if(nums == null || len <3) return ans;
//进行排序
nums.sort((a,b)=>a-b)
//假设nums[i]值已定,寻求另外两个值,使其三者之和为0
for(let i =0;i<len;i++){
//如果当前值大于0,那么不存在满足条件的
if(nums[i] >0) break;
//如果该值与前一个值相同,则去重
if(i>0 && nums[i] === nums[i-1]) continue
//寻求另外两个数
let L = i + 1;
let R = len -1;
//开始寻找剩下的两个数
while(L<R){
let sum = nums[i] + nums[L] + nums[R]
if(sum === 0){
//满足条件,放入数组中
ans.push([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--;
}else if(sum < 0) {L++}
else if(sum > 0) {R--; }
}
}
return ans
};
本文详细解析了经典的三数之和问题,并提供了一种高效的双指针解决方案。通过示例展示如何寻找数组中三个元素的组合,使它们的总和为零,同时避免重复的三元组。

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



