三数之和
三数之和 (opens in a new tab)
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
function threeSum(nums: number[]): number[][] {
nums.sort((a, b) => a - b);
const len = nums.length - 1;
const res: number[][] = [];
for (let i = 0; i <= len; i++) {
const v1 = nums[i];
// 当前值大于0,后面的值都大于0,不可能相加等于0
if (v1 > 0) {
break;
}
let left = i + 1,
right = len;
// 去重,避免重复计算
while (nums[i] === nums[i + 1]) {
++i;
}
while (left < right) {
const sum = nums[left] + nums[right] + v1;
if (sum === 0) {
res.push([v1, nums[left], nums[right]]);
--right;
++left;
while (nums[left] === nums[left - 1]) {
++left;
}
while (nums[right] === nums[right + 1]) {
--right;
}
} else if (sum < 0) {
++left;
} else {
--right;
}
}
}
return res;
}