0%

三数之和

三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

题目描述

双指针解法(分解成一个数字 + 双数之和的问题)

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
35
36
37
38
39
40
var threeSum = function (nums) {
const sortArr = nums.sort((a, b) => a - b)
let result = []
for (let i = 0; i < sortArr.length - 2; i++) {
if (i > 0 && nums[i] === nums[i - 1]) continue; // 去重

const sum = 0 - sortArr[i]
const sumArr = sortArr.slice(i + 1)
let LIndex = 0
let RIndex = sumArr.length - 1

while (LIndex < RIndex) {
const tempSum = sumArr[LIndex] + sumArr[RIndex]

if (tempSum < sum) {
LIndex++
} else if (tempSum > sum) {
RIndex--
} else {
console.log(i, LIndex, RIndex)
result.push([sortArr[i], sumArr[LIndex], sumArr[RIndex]])

while (LIndex < RIndex && sumArr[LIndex] === sumArr[LIndex + 1]) {
// 去重
LIndex++
}

while (LIndex < RIndex && sumArr[RIndex] === sumArr[RIndex - 1]) {
// 去重
RIndex--
}

LIndex++
RIndex--
}
}
}
return result
}