算法题-11

📅 发布时间:2026/7/7 11:11:32 👁️ 浏览次数:
算法题-11
给你一个整数数组nums判断是否存在三元组[nums[i], nums[j], nums[k]]满足i ! j、i ! k且j ! k同时还满足nums[i] nums[j] nums[k] 0。请你返回所有和为0且不重复的三元组。注意答案中不可以包含重复的三元组。示例 1输入nums [-1,0,1,2,-1,-4]输出[[-1,-1,2],[-1,0,1]]解释nums[0] nums[1] nums[2] (-1) 0 1 0 。nums[1] nums[2] nums[4] 0 1 (-1) 0 。nums[0] nums[3] nums[4] (-1) 2 (-1) 0 。不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。注意输出的顺序和三元组的顺序并不重要。示例 2输入nums [0,1,1]输出[]解释唯一可能的三元组和不为 0 。示例 3输入nums [0,0,0]输出[[0,0,0]]解释唯一可能的三元组和为 0 。首先这道题最直观的做法是三重循环但是三重循环是立方级别的复杂度关键有两个方面第一就是我们能否先进行一个排序使其变成有序素组这样可以方便我们的去重也可以使用双指针来降低算法的复杂度。我们先固定一个数然后使用双指针思路是for i left i1 right n-1变成nums[i] nums[left] nums[right] 0然后如果和大了 → right--如果和小了 → left如果等于 → 记录答案。一定要进行去重如果我们发现当前i指向的下一位也是同样的数字那么我们可以跳出这次循环。i 去重if(i 0 nums[i] nums[i - 1]) continueleft 去重while(left right nums[left] nums[left 1]) leftright 去重while(left right nums[right] nums[right - 1]) right--整体代码var threeSum function(nums) { const res [] nums.sort((a,b) a-b) for(let i 0; i nums.length - 2; i) { if(i 0 nums[i] nums[i-1]) continue let left i 1 let right nums.length - 1 while(left right) { const sum nums[i] nums[left] nums[right] if(sum 0) { res.push([nums[i], nums[left], nums[right]]) while(left right nums[left] nums[left1]) left while(left right nums[right] nums[right-1]) right-- left right-- } else if(sum 0) { left } else { right-- } } } return res }