015-三数之和
原题:三数之和
思路:排序后头尾双指针向中间移动
这题是我永远滴痛,在没任何算法基础的时候有一家心仪的公司就挂在这题的变体!!
思路
这种找边界组合的问题,一般通过排序 + 双指针就能解决,这题就是非常经典的一道题
这题要求的是三数和为 0
即 a + b + c = 0
,稍微理解下技能明白,求 a
固定时 b
和 c
的不同组合,就能解决这道题
1. 排序
从小到大排序,这边为了方便我们直接用库函数就行
1 | nums = nums.sort((a, b) => a - b); |
2. 开始遍历每一个数字
- 若当前数字大于 0,因为是升序,右边的数只会更大,结果必定大于 0,直接返回结果
1 | if (nums[i] > 0) return result; |
- 如果当前下标大于 0 且当前数与上一数相同,跳过,避免重复解
i > 0 && nums[i] === nums[i - 1]
1 | if (i > 0 && nums[i] === nums[i - 1]) continue; |
- 定义指针 L 指向下一个数
i + 1
,指针 R 指向数组尾部nums.length - 1
1 | var L = i + 1; |
3. 移动两指针直到相遇
- 如果和为
0
,推入结果,跳过两侧指针相同的值
1 | if (nums[i] + nums[L] + nums[R] === 0) { |
- 如果和大于
0
,则需要更小的值,右侧指针移动R--
1 | else if (nums[i] + nums[L] + nums[R] > 0) R--; |
- 如果和小于
0
,则需要更大的值,左侧指针移动L++
1 | else L++; |
4. 跳出两个循环后
直接返回结果
完整代码
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 乱炖锅!
评论