/** * 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; }