三数之和
大约 1 分钟
三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
排序,三指针
function threeSum(nums) {
const result = []
// 必须传入对比函数
const newNums = [...nums].sort((val1, val2) => val1 - val2)
// newNums[i] < 0 保证所有的有正值,也有负值 i < newNums.length && newNums[i] < 0
for (let i = 0; i < newNums.length - 2; i++) {
// 从第一个开始取第一个数
let left = i
let mind = i + 1
let right = newNums.length - 1
// 如果有重复数字就跳过
if (left > 0 && newNums[left] === newNums[left - 1]) {
continue
}
// 移动中间的指针和右边指针来控制大小
while (mind < right) {
if (newNums[left] + newNums[mind] + newNums[right] > 0) {
right--
// 处理重复
while (mind < right && newNums[right] === newNums[right + 1]) {
right--
}
}else if (newNums[left] + newNums[mind] + newNums[right] < 0) {
mind++
while (mind < right && newNums[mind] === newNums[mind - 1]) {
mind++
}
}else{
result.push([newNums[left], newNums[mind], newNums[right]])
right--
mind++
while (mind < right && newNums[right] === newNums[right + 1]) {
right--
}
while (mind < right && newNums[mind] === newNums[mind - 1]) {
mind++
}
}
}
}
return result
}