86 lines
2.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* https://leetcode.cn/problems/3sum/?envType=study-plan-v2&envId=top-interview-150
* @param {number[]} nums
* @return {number[][]}
*/
const threeSum = function (nums) {
};
/*
先对数组排序然后遍历数组如果遍历的当前元素大于零则表示后面的元素不可能组合在一起和为0如果当前元素小于零那么就对剩余的所有元素
使用两数之和的方法寻找target=当前元素的相反数,如果找到就返回这几个元素,然后遍历下一个元素
*/
function f1(nums) {
nums.sort((a, b) => a - b); // 先对数组排序
const result = []; // 结果数组
for (let i = 0; i < nums.length; i++) {
// 如果当前元素大于零直接结束循环,后面的查找没意义
if (nums[i] > 0) break;
// 如果当前元素等于前面的元素也跳过
if (i > 0 && nums[i] === nums[i - 1]) continue;
// 按照两数之和的方法寻找nums[i] 的相反数也就是target == -nums[i]
let left = i + 1;
let right = nums.length - 1;
while (left < right) {
const target = nums[left] + nums[right];
if (target === -nums[i]) {
result.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--;
continue;
}
if (target < -nums[i]) {
left++;
continue;
}
if (target > -nums[i]) {
right--;
continue;
}
}
}
return result;
}
/*
使用ifelse 减少判断逻辑
*/
function f2(nums) {
nums.sort((a, b) => a - b); // 先对数组排序
const result = []; // 结果数组
for (let i = 0; i < nums.length - 2; i++) {
// 如果当前元素大于零直接结束循环,后面的查找没意义
if (nums[i] > 0) break;
// 如果当前元素等于前面的元素也跳过
if (i > 0 && nums[i] === nums[i - 1]) continue;
let left = i + 1;
let right = nums.length - 1;
while (left < right) {
const sum = nums[i] + nums[left] + nums[right];
if (sum === 0) {
result.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--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}