三数之和
题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
题目分析
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路(一)
注意: if(i>0&&nums[i] == nums[i-1]) continue; //continue只是结束本轮两值相同的循环,继续重新执行for的新循环,要选择相同的值中的前面的值进行循环判断
不能采用 if(nums[i] == nums[i+1]) continue; //这样会丢失一组[-1,-1,2]的解
//两步去重,第一步直接对i去重,跳过相等的后一项循环
//第二步去重对循环中重复的L、R去重
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
let arr=[];
nums.sort((a,b)=>a-b); //对数组排序
for(let i=0;i<nums.length;i++){ //遍历当前元素
if(nums[i] > 0) break; //break直接结束for循环
if(i>0&&nums[i] == nums[i-1]) continue; //continue只是结束本轮两值相同的循环,继续重新执行for的新循环
let L=i+1; //初始值设置为当前元素nums[i]下一个
let R=nums.length-1;//初始值设置为右端最后一个元素
while(L<R){ //对当前数字的L和R进行去重
const sum=nums[i]+nums[L]+nums[R]
if(sum==0){
arr.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 arr;
};