老朋友 3Sum 哈哈。这个题目主要的点在于:
- 排序优化计算,可以跳过所有大于 0 的元素早退
- 双指针向中间移动寻找目标
- 有一个细节需要注意的就是,连续的相同的数字需要处理跳过的部分
代码如下:
const threeSum = (nums) => {
nums.sort((a, b) => a - b);
const res = [];
for (let i = 0; i < nums.length; i++) {
const curr = nums[i];
// skip all numbers if they are all positive
if (curr > 0) {
break;
}
// need to skip all the same numbers
if (i === 0 || (i > 0 && nums[i] !== nums[i-1])) {
const remain = 0 - curr;
let l = i + 1;
let r = nums.length - 1;
while(l < r) {
if (nums[l] + nums[r] === remain) {
res.push([curr, nums[l], nums[r]]);
// similar here, skip all the same numbers
while(l < r && nums[l] === nums[l + 1]) l++;
while(l < r && nums[r] === nums[r - 1]) r--;
l++;
r--;
} else if (nums[l] + nums[r] < remain) {
l++;
} else {
r--;
}
}
}
}
return res;
}