每天学习一点算法 2026/01/30
题目:三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
这道题可以变成再数字中找两数和为某一个数,我们遍历数组将然后在其余项中找与这个项和为 0 的两项即可,为了方便后续的选择操作,我们可以对数组进行排序,再利用双指针找到目标值(注意事项我就写在代码备注里面了)。
typescript
function threeSum(nums: number[]): number[][] {
nums.sort((a, b) => a - b) // 对数组进行排序
const res = []
for (let i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] === nums[i - 1]) continue // 跳过重复的项
if (nums[i] > 0) break; // 因为已经进行了排序,如果当前值已经大于 0 就不可能和为 0 了
let left = i + 1 // 左指针
let right = nums.length - 1 // 右指针
const traget = -nums[i] // 目标值
while (left < right) {
const sum = nums[left] + nums[right]
// 两数和与目标值不相等根据情况移动指针
if (sum > traget) {
right--
} else if (sum < traget) {
left++
} else {
// 两数和与目标值相等
res.push([nums[i], nums[left], nums[right]]) // 添加三元组至结果数组中
// 跳过重复项
while (left < right && nums[left] === nums[left + 1]) left++
while (left < right && nums[right] === nums[right - 1]) right--
// 移动指针
left++
right--
}
}
}
return res
};
题目来源:力扣(LeetCode)