LeetCode题解:15. 三数之和,JavaScript双循环+双指针,详细注释

本文深入解析LeetCode经典题目“三数之和”的JavaScript实现,采用排序加双指针法,通过图解详述算法步骤,有效避免重复解,提高搜索效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阅读更多系列文章请访问我的GitHub 博客

原题链接:https://leetcode-cn.com/problems/3sum/

该题解为三数之和(排序+双指针,易懂图解)的JavaScript实现,并附上了详细注释,帮助理解。

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function (nums) {
  let result = [];
  nums.sort((a, b) => a - b);

  for (let k = 0; k < nums.length; k++) {
    // 当前值大于0时,3个数都大于0,3数之和必然大于0,无需判断
    if (nums[k] > 0) {
      break;
    }

    // // 如果当前值与前一个值相等,即为已经处理过
    if (nums[k] === nums[k - 1]) {
      continue;
    }

    // 使用i和j双指正来遍历k之后的元素,查找满足条件的值
    let i = k + 1;
    let j = nums.length - 1;

    // 双指针解法
    // i小于j表示指针还未查询完所有数组
    while (i < j) {
      let sum = nums[k] + nums[i] + nums[j];

      // sum小于0,表示nums[i]的值偏小,可以将i指针向后移动
      if (sum < 0) {
        i++;
        // 避免查找i指针对应的相同值
        while (i < j && nums[i] === nums[i - 1]) {
          i++;
        }
      }

      // sum大于0,表示nums[i]的值偏大,可以将j指针向前移动
      if (sum > 0) {
        j--;
        // 避免查找j指针对应的相同值
        while (i < j && nums[j] === nums[j + 1]) {
          j--;
        }
      }

      // sum等于0,表示已经找到了结果,此时将i和j向内移动
      // 由于可能有不止一个解,需要继续寻找
      if (sum === 0) {
        result.push([nums[k], nums[i], nums[j]]);
        i++;
        j--;
        // while循环必须在每个逻辑中单独处理
        // 如果在所有逻辑之后统一处理i、j,会造成部分结果被跳过
        // 避免查找i指针对应的相同值
        while (i < j && nums[i] === nums[i - 1]) {
          i++;
        }
        // 避免查找j指针对应的相同值
        while (i < j && nums[j] === nums[j + 1]) {
          j--;
        }
      }
    }
  }

  return result;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值