ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

高效刷穿LeetCode Hot 100:两遍刷题法、题型拆解与复盘指南

高效刷穿LeetCode Hot 100:两遍刷题法、题型拆解与复盘指南 如果你问我刷 LeetCode 到底该从哪道题开始我多半不会直接报题号而是劝你先找一份 Hot 100 题单。这不是偷懒而是这些年带过团队面试、自己也完整走过一轮之后我越来越确信一件事Hot 100 是投入产出比最接近 1:10 的刷题范围。它不像全站两千多题那样让人无从下手也不像只刷 easy 那样信息量太低而是精准覆盖了面试中最常出现的一批数据结构与算法套路。这篇刷题记录不是把 100 道题的题解复制粘贴给你而是把“如何刷完这份清单、怎么把题目沉淀成可迁移的解题范式、以及刷题过程中哪些坑值得单独记一笔”完整复盘出来。它适合三类人准备校招或社招算法面试的人、转码选手、以及刷到第 50 题就陷入迷茫的中途放弃症患者。我自己就是从每天焦虑“刷不完”的状态走过来的这套方法帮我在两个多月内把 Hot 100 过了两遍手写代码的速度和准确率都有了实打实的提升。1. 先把题单吃透为什么是 Hot 100 而不是两千题1.1 Hot 100 的真实构成高频考点并不平均分布很多人拿到 Hot 100 之后的第一反应是照着一道道做做完一道删一道。这个做法不算错但效率很低因为你没有先看清这份题单的结构。我按自己的习惯把 Hot 100 重新归类过核心模块大致是这些数组与双指针、哈希表、滑动窗口、二叉树与递归、回溯、动态规划、贪心、链表、堆/优先队列、二分查找、单调栈、并查集与图相关。注意这里的分布并不均匀动态规划和二叉树/递归相关题目占比明显偏高其次才是双指针和哈希表。为什么是这个比例因为面试官考察的从来不是“你背过多少题”而是你在白板上解决问题时的思维路径。动态规划和递归能同时考察你的状态抽象能力、边界处理能力和代码整洁度一轮 45 分钟的面试里出两道这类题就能把候选人筛得很清楚。而纯数据结构题比如链表反转只要你写过一遍就忘不了区分度反而低。所以建议你在开始刷之前先把题单过一遍按上述模块给每道题打标签。这样做有两个好处一是你能清楚看到自己的薄弱区在哪儿二是你可以按模块集中刷而不是让题目在脑子里乱成一锅粥。1.2 两遍刷题法第一遍求“会”第二遍求“稳”我见过太多人刷题的方式是打开一道题想了二十分钟没思路直接看题解抄一遍然后告诉自己“这题我会了”。第二天再遇到同类型依然不会。这种“刷题”本质上是自我感动。我采用的方式是两遍刷题法。第一遍的目标只有一个把题做出来搞懂为什么是这个解法。每道题给自己 30 到 45 分钟思考时间如果真没有思路可以看题解但看完必须合上答案自己完整写一遍并且要能讲清楚“这个解法到底在优化哪个环节”。这一步不求快哪怕一天只做两三道都行关键是每一道都真正入了脑子。第二遍的目标是“稳”。同一个模块刷完后隔几天回来重做这些题不看题解限时完成。你会发现有些题第一遍觉得自己懂了第二遍一上手就卡壳——恭喜你这就是你需要重点记录和反复训练的题。能两次都顺畅写出来的题目才是真的属于你的东西。两遍之间的间隔建议在 3 到 7 天太短了只是短期记忆太长了前面学的都忘了。我自己的节奏是每周日把本周做过的题重新限时做一遍标记状态A 代表秒杀B 代表有思路但写得慢C 代表完全忘了。最后只针对 B 和 C 加练。1.3 记录文档到底记什么题解之外的复盘模板刷题记录不是把题目和代码粘进笔记就完了。真正有价值的记录是记录“我当时为什么没想到”和“这个解法为什么能想到”。我个人的记录模板包含四块题目一句话概括、核心考点分类、我的第一思路与卡点、最优解法的关键洞察。比如做一道滑动窗口题卡点往往是“不知道窗口右侧何时扩张、左侧何时收缩”那记录时就写清楚这个套路右指针负责扩大窗口左指针负责在条件不满足时收缩。下一次遇到类似题先想“这题有没有滑动窗口的单调性”。另外我会记录每道题的时间复杂度和空间复杂度推导。很多人觉得这就一行字随便写写就行其实不然。复杂度分析是面试里最容易追问的部分你能把 O(n) 怎么来的、为什么空间是 O(1) 讲清楚比多背十道题更有用。所以这份文档更准确地说是一份“错题本 套路本”它记录的不是题而是你思维的成长轨迹。2. 按题型拆解的实操要点从二分到动态规划2.1 二分专题073 爱吃香蕉的狒狒与“二段性”思维Hot 100 里纯二分题并不算多但二分是很多高级解法的底层工具。这里必须提一下最近大家常讨论的 073 号题也就是 LeetCode 875 的原题“爱吃香蕉的狒狒”Koko Eating Bananas。这道题虽然不在官方 Hot 100 的正表里但很多扩展题单把它排在了第 073 位作为二分答案的入门题非常经典。题目本身很简单有一堆香蕉每堆数量给定狒狒一小时只能吃一堆且吃得快慢由速度 K 决定要求在总时间 H 小时内吃完所有香蕉求最小的 K。我第一次做这题时走了弯路想着怎么模拟狒狒一小时一小时吃的过程结果又慢又容易出错。后来才意识到这是个典型的二分答案问题K 和总耗时之间存在单调关系K 越大耗时越短。既然是单调的就可以对 K 做二分而不是对每堆香蕉做模拟。二分答案的核心是“二段性判断”——你不需要求出精确答案只需要能够快速判断“给定一个候选值是否可行”。这里判断可行性的方法就是遍历每堆香蕉计算(pile K - 1) / K小时向上取整累加看是否不超过 H。这里有个小细节很容易踩坑计算耗时一定要用向上取整Java 里可以直接(pile K - 1) / KPython 里用(pile K - 1) // K避免浮点误差。另一个坑是二分边界的起点。很多人习惯 right 取数组最大值这没错但 left 一定要从 1 开始不能从 0 开始因为速度 K 至少得是 1否则除数为 0 直接异常。这个低级错误我在周赛 430 期前后就见过不少新手犯。整体上看这道题的价值不在于难而在于帮你建立“单调性可以转化为二分查找条件”的直觉后面再做求最小最大值的题目时你会第一时间想到这个方向。2.2 二叉树与递归先序框架解决 80% 的树题二叉树题目在 Hot 100 里占比很高种类也杂最大深度、最近公共祖先、层序遍历、二叉树展开为链表、路径总和……看起来五花八门但把它们的解法拆开后会发现递归返回值的语义定义是唯一重要的分水岭。我刷这类题的心得是每道题先问自己三个问题。第一函数的返回值是什么是子树的高度、是布尔判断、还是处理后的链表头第二在当前节点需要做什么是直接返回、比较左右子树的结果、还是把左右子树串起来第三递归的终止条件是什么是 null 返回还是叶子节点返回举个例子求二叉树最大深度递归函数返回的是当前节点的子树深度那递归逻辑就是左子树最大深度和右子树最大深度取较大值再加一。这个过程不需要脑补递归怎么一层层展开只需要相信“这个函数已经能算出一个节点左右子树的高度”剩下的就是组合逻辑。等你能熟练回答这三个问题后再去看最近公共祖先这类题难点就变成了对返回值的语义扩展一个递归函数同时要表达“找到了 p找到了 q或者找到了它们的公共祖先”三种状态。大多数树题卡住都不是不会写代码而是没有想清楚这个递归函数到底在“返回什么”——这是二叉树专题里最值得花时间琢磨的核心。2.3 回溯与 DP两种最容易“一看题解就懂一动手就废”的题型回溯和动态规划是 Hot 100 里劝退率最高的两类题原因很一致你很难通过“看懂代码”来获得真正的解题能力。回溯题的重点是剪枝与状态撤销。比如组合总和、全排列这类题基本框架就是“选择某条分支 - 递归 - 撤销刚才的选择”。很多人写了递归却忘记撤销导致结果里出现大量重复组合。我见过太多人 debug 半天最后发现只是少了path.pop()一行。所以写回溯题时我会刻意把“状态恢复”和“递归调用”写在同一逻辑层级培养肌肉记忆。动态规划则完全是另一套思维你需要的不是搜索而是把一个大问题拆成有递推关系的子问题。做 DP 题我会死磕两件事状态定义和转移方程。比如经典的最长递增子序列定义dp[i]为以第 i 个元素结尾的最长递增子序列长度转移方程就是遍历 i 之前所有元素 j如果nums[j] nums[i]则dp[i] max(dp[i], dp[j] 1)。状态定义一旦想清楚代码反而是最简单的那一步。如果你在 DP 上反复卡壳我的建议是不要急着刷更多题先把同一道题做三遍。第一遍看题解第二遍合上书写第三遍隔一天后不看任何提示限时写。三道经典 DP 题用这种方法吃透效果远好于粗糙地过二十道新题。3. 实操过程与核心环节实现我的 Hot 100 刷题流水线3.1 从签到到计划每天 3 题的节奏设计刷题最怕的不是难而是断。今天想起来刷了四五道明天加班没碰后天就彻底不想打开了。所以我给自己设计的是一套“低门槛、强反馈”的节奏工作日每天 3 道周末做一次整块复盘。3 道这个数字不是拍脑袋定的它刚好能让一套完整的思考过程跑完一道题目从读题、思考、写码、测试到记录平均 40 到 60 分钟三题就是两到三个小时不会太累又能保持手感。如果当天状态很差我也允许自己只做一道但前提是必须把这道题记进复盘文档哪怕答案是抄的。这样做是为了维持“每天都在推进”的惯性。坚持三周后你会发现每天打开编辑器已经像上班打卡一样自然了。节奏设计里还有一个容易被忽略的点要预留缓冲日。一周里至少留一天不去接触新题专门用来复习旧题。盲目贪多会导致复习欠账越来越多最后整个计划崩盘。宁可每天少做一道也不要牺牲复盘时间。3.2 手写二分模板一个右移比除法更容易踩坑我每次面试前都会手写一遍二分查找模板不是因为 Hot 100 里有多少道纯二分题而是因为二分是高频代码片段写不熟会在简单题上丢分。这里分享一个我踩过多次坑的细节中间值的计算方式。很多人写mid (left right) / 2这在大多数情况下没毛病但一旦left right超过 int 范围就会溢出结果变成负数。所以规范写法应该是mid left (right - left) / 2或者用 Python 的//运算。这个写法的代价为零收益是避免一个极其隐蔽的运行时错误。二分另外一个容易出错的点是循环条件是left right还是left right这取决于你对边界区间的定义。我用的是左闭右闭区间所以循环条件是left right且更新时right mid - 1、left mid 1。习惯了这套写法后再写“left right”的老式写法非常容易自相矛盾。我强烈建议你只固守一种区间定义不要今天用开区间明天用闭区间否则面试时会在边界上白白消耗时间。在刷 073 爱吃香蕉的狒狒这类二分答案题时模板稍作调整即可二分的是速度 K而不是数组下标所以判断条件变成了“当前速度能否在 H 小时内吃完”。这正是二分的精髓——它不仅能查下标还能查所有具备单调性的数值区间。3.3 用周赛检验水平发现自己“会但快不起来”刷完一遍 Hot 100 之后很多人会产生一个错觉我好像啥都会了。这时候我建议你用一场周赛来戳破幻觉我印象比较深的是周赛 430 期题目整体难度适中但恰好能暴露出“会而不快”的问题。为什么周赛比平时刷题更能检验水平因为它有时间压力。平时刷题你可以想 20 分钟写 20 分钟错了慢慢调周赛里每道题只有 10 到 15 分钟的预算逼你在有限时间内读题、识别题型、套模板、测试边界。这几乎就是面试的真实节奏。我参加周赛的体验是前两道基础题通常在 15 分钟内能过说明 Hot 100 里练过的双指针、模拟、哈希套路确实形成了肌肉记忆第三题开始明显吃力因为需要把多个套路组合使用。比如一道题既要用排序又要用双指针甚至还要用二分优化这时候单纯背题就不够用了得能灵活调用不同模块。赛后我会把卡住的题单独挑出来找到它对应 Hot 100 里的“母题”回去重做母题一遍再回来做周赛题效果比盯着陌生题死磕好得多。3.4 复盘记录的沉淀用提交历史反推薄弱点我的刷题记录到最后不只是一份笔记更像一份“个人算法体检报告”。每周日我会打开自己的代码提交历史统计一下哪些题提交次数最多、哪些题调试时间最长这些就是我的薄弱点。比如你发现滑动窗口类的题提交次数普遍偏高那就说明窗口边界的移动逻辑还没吃透。这时候不要急着刷回去做新题而是把这一类已做题重新总结一遍找出共同套路——窗口在什么条件下扩张什么条件下收缩答案在扩张时更新还是收缩时更新。总结出来后再找两道同类型新题验证。这个“统计 - 归类 - 重新总结 - 新题验证”的闭环是我认为整套刷题过程中最有价值的部分。要知道刷题数量从来不是目的。当你的记录文档里开始出现越来越多“这类题的套路是……”而不是“这道题要背这个代码”时说明你已经从题海战术过渡到了范式总结阶段。4. 常见问题与排查技巧实录4.1 常见问题速查表我在刷题群和日常交流里收集了不少高频问题顺手整理成一个速查表供大家对照自查。现象可能原因排查/解决思路看了题解能懂合上就忘缺少主动输出环节看完题解后合上答案白纸写一遍并口头讲解思路正确但代码反复编译错手写代码量不足用本地编辑器关掉自动补全练习手敲完整代码递归题一涉及返回值就混乱没有先定义递归函数语义写函数前用注释写明参数、返回值含义滑动窗口题答案总差一位窗口更新时机不对画图模拟指针移动过程确定窗口满足条件时再更新答案DP 题不知道状态怎么定义从暴力递推开始推导先想暴力解找出重复子问题再把问题规模作为状态维度思路对了但超时时间复杂度超标用大 O 分析定位瓶颈考虑哈希表、二分或滑动窗口优化这张表我自己也用过很多次每次刷题卡住时先对号入座比硬扛半小时高效得多。4.2 几个值得尝试的硬核技巧最后分享几个常规题解里不会写但非常实用的技巧。一是边界用例测试。写完代码不要急着提交先在脑子里跑三个用例空输入、单元素输入、元素已经有序或完全逆序的输入。很多 bug 藏在这三类用例里提前发现能省下好几次提交罚时。二是“五分钟读题法”。拿到一道题前五分钟只做三件事确定输入规模、估算允许的时间复杂度、判断可能的题型。输入规模是 n10^5那 O(n^2) 大概率不可行就该往排序、双指针、二分方向想输入规模很小那暴力搜索或全排列可能才是正解。这个习惯能帮你在大方向上一开始就不跑偏。三是刻意练习手写代码不依赖 IDE 补全。我现在每周至少用记事本或白板环境手写两到三道题目的纯粹是为了模拟面试场景。等你在编辑器里已经能一次写出无语法错误的代码再进白板环节心态会稳很多。写在最后的一点体会刷完两遍 Hot 100 之后我最大的感受是你不是“记住了一百道题”而是“建立了一套解决问题的反应回路”。看到“求最大/最小”会条件反射想到二分答案或 DP看到“连续子数组”会条件反射想到滑动窗口或前缀和看到“连通性”会条件反射想到 DFS/并查集。这种条件反射只能通过反复的“输入 - 思考 - 犯错 - 修正”来建立任何捷径都不存在。如果让我给刚起步的朋友一个最实在的建议那就是别贪多先把 Hot 100 这份题单完整吃透每道题都坚持用“思考 - 实现 - 笔记 - 复习”的流程走下来。等你把这一百道题变成自己的肌肉记忆后再回头看那些曾经觉得不可逾越的难题你会发现它们只是几个熟悉套路的不同组合而已。所谓题感说到底就是无数次重复后自然长出来的东西。
返回列表