三数之和
题目:三数之和
给你一个整数数组nums,判断是否存在三元组[nums[i], nums[j], nums[k]]满足i != j、i != k 且 j != k,同时还满足nums[i] + nums[j] + nums[k] == 0。请你返回所有和为0且不重复的三元组。
注意:答案中不可以包含重复的三元组。
最简单的思路就是多层for循环,当数据量过大时这种情况无法通过leetcode测试,我们可以使用双指针的方式进行遍历筛选,如下:
- 先对数组进行排序
- 遍历数组,
i从1到length-2,借助前置指针s和后置指针e,s从i-1开始递减,e从i+1开始递增 - 如果
nums[s] + nums[i] + nums[e] == 0,记录该值;如果大于0则s--;如果小于0则e++ - 当
nums[s] + nums[i] + nums[e] == 0时借助辅助数组或对象判断重复 - 如果
s大于0,nums[s] + nums[i] + nums[e]必大于0,则s-- - 如果
e小于0,nums[s] + nums[i] + nums[e]必小于0,则e++
var threeSum = function (nums) {
nums.sort((a, b) => (a - b))
let res = [], mid = {}
for(let i = 1; i < nums.length -1; i++) {
let s = i - 1, e = i + 1
// if (mid.includes(nums[i])) continue
while(s >= 0 && e < nums.length) {
// s-1等于当前s,跳过避免重复
if (nums[s] > 0 || nums[s] == nums[s - 1]) {
s --
continue
}
// e+1等于当前e,跳过避免重复
if (nums[e] < 0 || nums[e] == nums[e + 1]) {
e ++
continue
}
let sum = nums[s] + nums[i] + nums[e]
if (sum == 0) {
const arr = [nums[s], nums[i], nums[e]]
if (!mid.hasOwnProperty(arr.toString())) {
res.push(arr)
mid[arr.toString()] = 1
}
s--, e++
} else if(sum < 0) {
e++
} else if(sum > 0) {
s--
}
}
}
return res
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
上面的代码虽然能通过测试,实际的效率确非常低,所以要对上面的代码进行优化。
上次更新: 2025/09/05, 8:09:00