给你一个整数数组 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 。
提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105
思路:
在排好序的数组里,取第一个元素为target,剩余的左(x)右(y)夹逼。target+x+y,>0时右边缩进,<0时左边缩进。当x==y相遇后,target+1
代码:
var threeSum = function(nums) {
let arr = []
// 直接sort()是根据字母、数字大小排序,导致-1排在-3左边
nums.sort((a,b) => a-b)
for (let i = 0; i < nums.length-2; i++) {
// 当遍历下一个target与前面的相同时,跳过
if (i > 0 && nums[i] == nums[i-1]) continue
let target = nums[i], x = i + 1, y = nums.length - 1
while (x < y) {
let sum = target + nums[x] + nums[y]
if (sum == 0) {
arr.push([target, nums[x], nums[y]])
// 准备夹逼前,将左右俩边移到相同数值最紧处
while (x < y && nums[x+1] == nums[x]) x++
while (x < y && nums[y-1] == nums[y]) y--
// 有了上述的准备过程,这里夹逼时,左右俩边数值与上次数值不同
x++
y--
} else if (sum > 0) {
y--
} else {
x++
}
}
}
return arr
};
标签:15,target,nums,++,三数,示例,三元组,let,打卡
From: https://blog.51cto.com/u_16101563/8995137