Skip to main content

三数之和

2022/06/11

https://leetcode.cn/problems/3sum/

示例

示例一

输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]

示例二

输入:nums = [] 输出:[]

示例三

输入:nums = [0] 输出:[]

思考过程

题解参考,双指针

var threeSum = function (nums) {
const n = nums.length
// 先对数组进行排序方便后续操作的时候排除重复的因素
nums = nums.sort((a, b) => a - b)
// 用于存放所有答案的数组,答案是数组,所以这会是一个二维数组
const ans = []
// 头指针,遍历出答案的第一个数字a
for (let first = 0; first < n; first++) {
// 由于题解不能重复,所以当第一个数字重复时则可跳过
if (first > 0 && nums[first] === nums[first - 1]) {
continue
}
// 尾指针,用于找出答案的第三个数字c
let third = n - 1
// 将a的取反作为b与c的两数之和
let target = -nums[first]
// 中间指针,遍历出答案的第二个数字b,在这个过程中也会找出数字c
for (let second = first + 1; second < n; second++) {

// 类似判断在上面出现过,由于题解不能重复,所以跳过
if (second > first + 1 && nums[second] === nums[second - 1]) {
continue
}

// 数组已经过排序,若b、c之和大于target,则应该将c再往前指
while (second < third && nums[second] + nums[third] > target) {
--third
}

// 指针重合了,退出循环
if (second === third) {
break
}

// 找到题解了,将题解放入ans中
if (nums[second] + nums[third] === target) {
ans.push([nums[first], nums[second], nums[third]])
}
}
}
return ans
};