题目描述
思路解析动画文字版
记住这条「大了缩右、小了扩左」,下面每一帧都在套它。
左右两端 1+25=26,比 14 大了。要让和变小,只能动右边——把右指针往左挪,换一个更小的数。
右指针左移到下标 10(值 22)。左指针不动,因为左边已经是当前最小、再小没意义。
左右两端 1+22=23,比 14 大了。要让和变小,只能动右边——把右指针往左挪,换一个更小的数。
右指针左移到下标 9(值 19)。左指针不动,因为左边已经是当前最小、再小没意义。
左右两端 1+19=20,比 14 大了。要让和变小,只能动右边——把右指针往左挪,换一个更小的数。
右指针左移到下标 8(值 17)。左指针不动,因为左边已经是当前最小、再小没意义。
左右两端 1+17=18,比 14 大了。要让和变小,只能动右边——把右指针往左挪,换一个更小的数。
右指针左移到下标 7(值 15)。左指针不动,因为左边已经是当前最小、再小没意义。
左右两端 1+15=16,比 14 大了。要让和变小,只能动右边——把右指针往左挪,换一个更小的数。
右指针左移到下标 6(值 12)。左指针不动,因为左边已经是当前最小、再小没意义。
左右两端 1+12=13,比 14 小了。要让和变大,只能动左边——把左指针往右挪,换一个更大的数。
左指针右移到下标 1(值 3)。右指针不动,因为右边已经是当前最大、再大就更超了。
左右两端 3+12=15,比 14 大了。要让和变小,只能动右边——把右指针往左挪,换一个更小的数。
右指针左移到下标 5(值 10)。左指针不动,因为左边已经是当前最小、再小没意义。
左右两端 3+10=13,比 14 小了。要让和变大,只能动左边——把左指针往右挪,换一个更大的数。
左指针右移到下标 2(值 5)。右指针不动,因为右边已经是当前最大、再大就更超了。
左右两端 5+10=15,比 14 大了。要让和变小,只能动右边——把右指针往左挪,换一个更小的数。
右指针左移到下标 4(值 8)。左指针不动,因为左边已经是当前最小、再小没意义。
左右两端 5+8=13,比 14 小了。要让和变大,只能动左边——把左指针往右挪,换一个更大的数。
左指针右移到下标 3(值 6)。右指针不动,因为右边已经是当前最大、再大就更超了。
左右两端 nums[3]=6 与 nums[4]=8,加起来正好 14 = 14,命中!这两个数就是答案。
命中的两个数绿色高亮。从两端往中间走,l 一路向右、r 一路向左,各只走一遍,O(n) 就找到了答案。
边界先想清:只要数组有序,正数负数都能用对撞双指针。
两个高频追问,区分「有序用双指针、无序用哈希」。
参考代码
def twoSum(numbers, target): l, r = 0, len(numbers) - 1 while l < r: s = numbers[l] + numbers[r] if s == target: return [l + 1, r + 1] # 1-based elif s > target: r -= 1 # 和太大,缩右 else: l += 1 # 和太小,扩左复杂度
- 时间:O(n),l、r 从两端往中间走,合计最多走 n 步
- 空间:O(1),只用两个指针,不开额外数组/哈希
易错点
面试追问把动画讲成自己的话
追问如果数组无序,这个对撞双指针还能用吗?
追问为什么本题不用哈希表?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
三数之和
LeetCode 15 · 中等 · 沿着 双指针 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题