# 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
// 手撸结果超时
// [Done] exited with code=0 in 106.705 seconds
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function (nums) {
let res = new Map()
nums = nums.sort((a, b) => a - b)
for (let i = 0; i < nums.length; i++) {
for (let j = 0; j < nums.length; j++) {
if (i === j) continue
const differenceIndex = nums.findIndex((e) => e === -(nums[i] + nums[j]))
if (![-1, i, j].includes(differenceIndex)) {
const _keys = [nums[i], nums[j], nums[differenceIndex]]
.sort((a, b) => a - b)
.toString()
if (!res.has(_keys)) {
res.set(
_keys,
[nums[i], nums[j], nums[differenceIndex]].sort((a, b) => a - b)
)
}
}
}
}
return [...res.values()]
}
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
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
// 排序 + 双指针
// [Done] exited with code=0 in 0.537 seconds
// 好多倍的差距
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum2 = function (nums) {
let length = nums.length,
res = []
nums = nums.sort((a, b) => a - b)
for (let first = 0; first < length; first++) {
if (first > 0 && nums[first] === nums[first - 1]) continue
let third = length - 1,
target = -nums[first]
for (let second = first + 1; second < length; second++) {
if (second > first + 1 && nums[second] == nums[second - 1]) continue
while (second < third && nums[second] + nums[third] > target) third--
if (second === third) break
if (nums[second] + nums[third] == target) {
res.push([nums[first], nums[second], nums[third]])
}
}
}
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
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