第3天早上打开 HOT100 题单,我第一反应还是想按题目顺序往下啃。但前面 DAY1、DAY2 的体验告诉我,这样看上去很努力,实际上没太多沉淀:同类型题目隔得太远,好不容易建立的手感很快又会凉掉。所以 DAY3 我临时改了策略,不再顺着题号走,而是把当前节点最需要补的“双指针”单独拿出来做一次专题突击。
这天的题量定在 4 道,由易到难分别是移动零、盛最多水的容器、三数之和、接雨水。全部做完后,比对前两天的效率,我明显感觉到:按主题刷比按题号刷更像是在掌握“解题能力”,而不是在收集“答案”。如果你也在跟着 HOT100 刷题,尤其是刷到第 3 天左右开始觉得题目越做越散,这篇文章应该能给你一个不太一样的节奏参考。
1. 为什么 DAY3 先刷双指针:前三天排兵布阵
1.1 前三天我给 HOT100 安排的刷法
我很早就发现,HOT100 这种题单如果从第 1 题硬刷到第 100 题,很容易在“刚接触一个新题型、还没完全吃透”的状态下,马上被另一类题目打断。所以我不把 HOT100 当成普通列表,而是先按自己的薄弱点拆成几个小专题,每 1 到 2 天集中解决一个。
DAY1 我做的是哈希表与数组基础,像两数之和、最大子数组和这类“同数组、同哈希”的题目,用来热身和恢复手感。DAY2 切到链表和滑动窗口,把反转链表、环形链表、无重复字符的最长子串放一起,重点练“线性结构上的连续移动”。到了 DAY3,顺理成章应该处理的是双指针的几种典型打法。
为什么把双指针放在第 3 天?因为很多题单里的高频题,最终解法都会退化到一句“用两个指针维护区间”。如果对双指针没有形成条件反射,后面做链表删除、滑动窗口、左右夹逼、快慢指针找环,都会反复卡在同一个原因上。所以第三天的定位,不是为了“完成题目”,而是为了搭一个解题脚手架。
1.2 为什么是 283-11-15-42 这条线
移动零、盛最多水的容器、三数之和、接雨水,这四道题在 HOT100 里都属于高频常客。但把它们串成一条线,不是因为“名气大”,而是因为它的难度和思维类型刚好是一个阶梯式上升。
移动零是典型的同向快慢指针,解决的是“原地整理数组”这类场景。盛最多水的容器第一次引入“左右夹逼”思路,需要你敢于丢弃一部分无效组合。三数之和把双指针和排序结合起来,同时引出了大量边界去重细节。接雨水则把两根指针和动态维护的左右最大值放在一起,属于双指针里比较高级的用法。
这四题的逻辑关系大约是:先解决“两个指针同向移动时谁负责覆盖”,再理解“相向移动时丢弃哪一边不会丢答案”,然后处理“双指针如何配合排序找到确定目标”,最后是“双指针如何维护左右峰值来计算区间贡献”。从单指针到双指针,再从同向到相向,思维负担是逐渐增加的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 四道真题拆解:双指针如何替代掉那层无效循环
2.1 移动零:快慢双指针处理原地覆盖
这题的字面要求很简单:把数组中的 0 全部挪到末尾,同时保持非零元素的相对顺序。很多人第一反应是另开一个临时数组,把非 0 放前面、0 放后面,最后再复制回去。这个思路正确,但没有满足题目“原地”的隐含意思,而且面试时通常不会止步于此。
双指针解法里,我让慢指针 slow 表示“下一个非零元素应该放置的下标”,快指针 fast 负责扫描整个数组。每次 fast 遇到非 0,就把这个值写到 slow 指向的位置;如果 fast 和 slow 不是同一个位置,就把 fast 原位置清成 0。这个写法的好处是把原来的“删除 0,再在末尾补 0”操作变成了线性时间内的原地覆盖。
python复制def moveZeroes(nums):
n = len(nums)
slow = 0
for fast in range(n):
if nums[fast] != 0:
nums[slow] = nums[fast]
if fast != s
