【JS力扣刷题笔记】15. 三数之和

这篇博客详细记录了使用JavaScript解决LeetCode第15题的过程,主要采用双指针法。首先对数组排序,然后固定一个数,用两个指针遍历数组寻找满足条件的另外两个数。通过不断调整指针位置来缩小目标和,同时处理重复元素以避免重复解。博主深入探讨了为何要特别考虑特定情况以及为何需要特定的去重策略。
摘要由CSDN通过智能技术生成

这是跟着代码随想录的顺序学习算法的第九天。

以下是学习题解时自己的一些理解与笔记,有错误欢迎指正与讨论。


15. 三数之和

参考相关链接:

15. 三数之和

代码随想录


笔记

15. 三数之和

此处利用双指针法解题的整体思路为,在 nums 数组长度不小于 3 前提下,设置三个指针 i, left, right

首先,对数组进行排序 nums.sort((a, b) => a - b); ,因为要用双指针法。

接着,i0 开始历遍 nums 直到 nums.length - 2 ,我们可以理解为,先取定了三个数中最左边的一个数,以此为基础,考虑另外两个数的所有情况

值得一提的是这里做了一个临界条件判断 if(nums[i] > 0) break; 提高了效率,因为数组已经排过序,此时的 nums[i] 是最小的,故其大于 0 则表明后续无解。

不妨假设符合要求的三个元素为 [a, b, c][nums[i], nums[left], nums[right]],按序排列。

  1. 取定 i 即取定了 a ,此时开始 a去重操作 if(i > 0 && nums[i] === nums[i - 1]) continue;,即为了在本次循环中 (第二次开始) 找到与上一个 a 不同的第一个元素,否则本次循环开始基于的条件与上次是重复的,即取定的最左边的数和上一次是一样的,这样会导致结果出现重复的情况。

    那为什么要进行 i > 0 的判断呢?

    第一点是为了 nums[i - 1] 有意义,如果只是为了这个,那为什么不直接用 nums[i] === num[i+1] 呢?

    这里的答案也就是此处的第二点,是为了考虑 [-1,-1,2] 的情况。

    那为什么用 i+1 会忽视掉这种情况呢?

    这是因为,我们是先取定a再对 a 进行去重。用 i+1 则成了先去重再取定几个相同元素中的最后一个。

    那为什么要这样来专门考虑 [-1,-1,2] 这样的情况?

    因为题目的要求是答案不可以包含重复的三元组,指的是不出现 [0,-1,1][1,-1,0] 的情况,而

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值