这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
三数之和
Hot100 15.三数之和
难度:中等
给你一个包含 n个整数的数组nums,判断nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例2:
输入:nums = []
输出:[]
示例3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000-10^5 <= nums[i] <= 10^5
题解
排序+双指针法
-
当 n < 3或数组为null时,返回
[]。 -
对数组进行排序。
-
遍历排序后的数组:
- 先固定一个数nums[i],再使用左右指向nums[i]后面的两端,数字分别为nums[L]和nums[R],计算三个数的和sum判断是否满足为0,满足则添加进结果数组res。
- 如果nums[i]大于0,则nums[i]大于0,则三数之和必然无法等于0,结束循环。
- 如果nums[i] == nums[i - 1],则说明该数字重复,会导致结果重复,所以应该跳过。
- 当sum == 0时,nums[L] == nums[L+1]会导致结果重复,需跳过,L++。
- 当sum == 0时,nums[R] == nums[R+1]会导致结果重复,需跳过,R--。
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
let res = [];
const len = nums.length;
if(!nums || len < 3) return res;
nums.sort((a,b) => a - b);
for(let i = 0; i < len; i++){
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) {
const sum = nums[i] + nums[L] + nums[R];
if(sum === 0){
res.push([nums[i],nums[L],nums[R]]);
// 去重
while(L<R && nums[L] === nums[L+1]) L++;
while(L<R && nums[L] === nums[R-1]) R--;
L++;R--;
}
else if(sum < 0) L++;
else if(sum > 0) R--;
}
}
return res;
};
时间复杂度:O(n^2)
空间复杂度:O(1)
坚持每日一练!前端小萌新一枚,希望能点个赞+在看哇~