本文已参与「新人创作礼」活动,一起开启掘金创作之路。
力扣刷题记录及讲解
给你一个包含 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
-105 <= nums[i] <= 105
通过次数785,866
提交次数2,283,275
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/3s…
`
/**
- @param {number[]} nums
- @return {number[][]} */ var threeSum = function(nums) { if(nums.length < 3 || !nums) { return [] }; let arr = [], len = nums.length-1; nums.sort((a,b)=> a-b); for(let i = 0; i < nums.length; i++) { if(nums[i] > 0) { break; } if(nums[i] === nums[i-1]) { continue } let l = i + 1; r = len; while( l < r) { let 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--; r--; l++; }else if( sum < 0) { l++; }else { r--; } } } return arr };
思路:先排序,滑块加双指针
1. 从小到大排序
2. 进行for循环遍历出每一个元素(当遍历到 nuns[i] > 0 的时候,此刻可结束,如果nums[i] === nums[i-1] 也就是和前一个相等,此时结果会重复,直接进入下一次循环)
3. 确定i,用双指针指向L(i+1)和最后一个数R(nums.length-1),然后相加 i, L, R三数相加得sum
4. 判断sum的三种情况:当sum = 0时满足条件添加至结果数组中,因为数组已经排序,此刻应while判断L是否等于L+1,如果相等则L+1,判断R是否等于R-1,如果相等则R-1;
5. 如果sum < 0, 此刻L应该+1 (L往右走一直增大才能满足sum变大)
6. 如果sum > 0, 此刻R应该-1 (R往左走一直减小才能满足sum变小)