# 三数之和
# 题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
# 思路
- 先进行从小到大的排序
- 左指针和右指针进行相加计算
- 如果小于0,和不够大,左指针向右移动;反之右指针向左移动
- 注意可重复,找到后继续移动指针
# 代码
function threeSum(nums) {
nums.sort((a, b) => a - b)
const result = []
for (let i = 0; i < nums.length; i++) {
const n1 = nums[i]
if (n1 < 0) break
if (i > 0 && n1 === nums[i - 1]) continue
let left = i + 1
let right = nums.length - 1
while (left < right) {
const n2 = nums[left]
const n3 = nums[right]
const n = n1 + n2 + n3
if (n === 0) {
result.push([n1, n2, n3])
// 执行完了,还要继续搜索
while (left < right && nums[left] === n2) left++
while (left < right && nums[right] === n3) right--
} else if (n < 0) {
left++
} else {
rigth--
}
}
}
return result
}