这是跟着代码随想录的顺序学习算法的第九天。
以下是学习题解时自己的一些理解与笔记,有错误欢迎指正与讨论。
15. 三数之和
参考相关链接:
笔记
15. 三数之和
此处利用双指针法解题的整体思路为,在 nums
数组长度不小于 3
前提下,设置三个指针 i, left, right
。
首先,对数组进行排序 nums.sort((a, b) => a - b);
,因为要用双指针法。
接着,i
从 0
开始历遍 nums
直到 nums.length - 2
,我们可以理解为,先取定了三个数中最左边的一个数,以此为基础,考虑另外两个数的所有情况。
值得一提的是这里做了一个临界条件判断 if(nums[i] > 0) break;
提高了效率,因为数组已经排过序,此时的 nums[i]
是最小的,故其大于 0
则表明后续无解。
不妨假设符合要求的三个元素为 [a, b, c]
即 [nums[i], nums[left], nums[right]]
,按序排列。
-
取定
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]
的情况,而不