15. 3Sum
题目简介
/**
* @param {number[]} nums
* @return {number[][]}
*/
题目给我们一个数字数组 nums,要求在数组中找出三个数字之和为 0 的所有不重复的三元组
解题思路
这一题是 two sum 的加强版
我们只需要先锁定一个元素(假设是 nums[0])后,其他的部份也可以用 two sum 的双指针来处理
这题还有一个难点就是要去除重复的三元组,这个需要三个步骤来处理:
- 首先我们需要对数组 nums 升序排序
- 对于 i>0,如果出现
nums[i] === nums[i-1],则直接跳过当前的 i(i 是第一个元素的遍历下标) - 当找到三元组
nums[i] + nums[left] + nums[right] === 0时,我们需要更新 left 以及 right 两个指针,此时如果nums[left] === nums[left - 1]或者nums[right] === nums[right + 1]时,也需要跳过当前的 left 与 right
Javascript
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function (nums) {
const res = []
const len = nums.length
nums.sort((a, b) => a - b)
for (let i = 0; i < len; i++) {
if (nums[i] > 0) {
break;
}
// prevent duplicate answers
if (i > 0 && nums[i] === nums[i - 1]) {
continue
}
const rest = -nums[i]
let left = i + 1
let right = len - 1
while (left < right) {
const twoSum = nums[left] + nums[right]
if (twoSum > rest) {
right--
} else if (twoSum < rest) {
left++
} else {
res.push([nums[i], nums[left], nums[right]])
right--
left++
// prevent duplicate answers
while (nums[left] === nums[left - 1] && left < right) {
left++
}
while (nums[right] === nums[right + 1] && right > left) {
right--
}
}
}
}
return res
};