ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LeetCode热题100刷题指南:高频考点与三轮高效刷题计划

LeetCode热题100刷题指南:高频考点与三轮高效刷题计划 聊 LeetCode 热题 100 之前先说个我自己的经历。去年带一个学弟准备暑期实习他算法底子一般每天刷题刷得挺猛但刷到第三周反而焦虑了——题量上去了一百多道可一合上题解脑子里还是空的。我给他的建议很简单立刻停掉那些零散的刷题计划把 LeetCode 热题 100 这一份题单吃透比什么都管用。很多准备面试的朋友对这份题单有误解以为它就是个普通题目合集或者觉得题目太“经典”、怕面试官不按套路出题。实际情况恰恰相反。热题 100 是 LeetCode 官方从大量面试出题反馈里聚合出来的高频题它反映的是各大公司在真实面试中反复出现的算法题分布。换句话说你在这份题单里练过的每一类题目都有很大概率在面试桌上原封不动地遇到。这篇文章我不会空谈“要不要刷题”而是从这份题单的构成、考点分布、几个热门题型的解题模板、完整的刷题计划到避坑经验一步步拆给你看。无论你是刚接触算法题的新手还是已经刷了一部分题想体系化梳理的老手这篇都能给你一个可以直接照着执行的方向。1. 热题 100 是什么先聊聊这份题单的含金量1.1 它不是编辑随手整理的榜单很多人以为热题 100 是 LeetCode 编辑根据“这题难不难”或者“这题有没有名”挑出来的。实际完全不是。这份题单的底层逻辑是数据驱动它会聚合大量用户在面试中遇到的真实题目反馈再结合题目被考察的频率、公司的分布等维度去筛选最终保留下来的是面试中出现频率最高的 100 道题。这意味着什么意味着它更新的不只是题目本身更是当前面试趋势的“晴雨表”。比如这几年动态规划相关题目在公司面试里出现频率变高热题 100 里 DP 类题目的比重和排序就会跟着调整。所以网上有人每隔几个月回顾热题 100都会发现榜单有细微变化这是正常的恰恰说明它是活的、贴近实战的。这个特点也决定了它的适用范围非常广。准备校招的应届生刷它是为了覆盖面试高频考点准备跳槽的职场人刷它是为了快速恢复算法手感就算你不面试拿它当算法基本功的训练清单也比自己漫无目的找题做高效得多。1.2 和 Blind 75、面试经典 150 比怎么选刷题圈子里还流传着另外两份有名的题单一份是 Blind 75一份是面试经典 150。经常有人问我“到底刷哪个”我的回答是看你的时间和你处在什么阶段。题单题量特点适合人群LeetCode 热题 100100 题官方数据驱动紧跟面试趋势覆盖全面绝大多数准备面试的求职者Blind 7575 题社区整理偏北美大厂风格精炼但覆盖略保守时间紧张、想抓核心题型的人面试经典 150150 题题量最大包含更多变种和细节题准备周期长、追求更全覆盖、目标大厂的人我的建议很简单如果时间只有 4 到 8 周优先热题 100因为它的选题逻辑最贴近“面试官真实会问什么”如果刷完热题 100 还有余力再去经典 150 里补充同类型变种这时候不是从头刷而是挑自己不熟的考点补短板。Blind 75 我更推荐作为查漏补缺的“快速清单”而不是主刷题单——它有些题目和热题 100 重叠有些却偏老对国内面试场景的覆盖不如热题 100 精准。1.3 难度构成别被中等题的数量吓到热题 100 的难度分布大致是三成简单题、六成中等题、一成多困难题。这个比例其实相当科学。简单题用来建立信心和巩固基础语法中等题是面试真正的“主战场”困难题则负责拉开区分度也是筛选高分候选人比如一些大厂的终面的主要手段。对新手来说我的建议是前期不要碰困难题。先把简单题和中等题刷扎实困难题留到第二轮甚至第三轮再攻坚。对已经有基础的朋友来说也不要轻视简单题——热题 100 里的简单题往往考察的是常用数据结构的熟练度比如链表的反转、快慢指针、哈希表的去重这类题在面试开场热身环节出现率极高写顺手了能省下大量时间留给后面的难题。2. 考点分布拆解这 100 题到底在考什么2.1 数据结构三大块数组链表、哈希表、树如果你把热题 100 的目录按考点归类会发现一个很明显的规律数组、链表、哈希表、二叉树这四类题加在一起占了半壁江山以上。这不是巧合而是因为绝大多数公司的面试官倾向于用这几种“万精油”数据结构去考察候选人写代码的基本功。数组相关的题目核心不外乎双指针、滑动窗口、前缀和、模拟遍历这些套路链表题则集中在反转链表、快慢指针找环、合并有序链表、删除倒数第 N 个节点哈希表就更是百搭了很多用暴力解法会超时的题加上一个哈希表就能把时间复杂度从 O(n²) 降到 O(n)。树这一块则集中在二叉树的遍历、层序遍历、最近公共祖先、路径和等问题上考验的是递归思维的熟练度。我自己刷完一整轮之后的感受是这些数据结构类题目就像篮球里的运球和投篮是所有人的基本功。面试时题目包装得再花哨最后落脚点大概率还是这几类。所以刷热题 100 的时候没必要被题目表面的“新题感”带偏多问自己一句“这题底层是哪个数据结构的哪个经典操作”刷完一轮你会发现自己有了“举一反三”的能力。2.2 算法思想四大件双指针、二分、动态规划、回溯数据结构之外热题 100 里最密集的算法思想就是这四类了。双指针和二分属于相对容易掌握的“套路题”动态规划和回溯则是大多数人的分水岭。双指针的题有个很明显的特征题目里出现“有序数组”“子数组”“连续区间”这些字眼时基本可以往双指针的方向想。滑动窗口本质上也是双指针的一种处理“最长不重复子串”“最小覆盖子串”这类问题时屡试不爽。二分查找则更隐蔽一些热题 100 里有一类“在有序数组里找目标”的题还有一类是我们要在后面重点讲的“二分答案”类题目后者是很多中等题的隐藏考点。动态规划在热题 100 里的占比相当可观背包问题、爬楼梯、零钱兑换、最长递增子序列这些高频题目全在里面。这一块没有捷径唯一有效的方法是掌握“状态定义 状态转移方程”的思考框架少背题解、多理解推导过程。回溯算法的核心就是“决策树”思维全排列、组合总和、子集这些题练熟之后你会觉得回溯反而是所有算法里最“模板化”的——一个递归函数加一个撤销操作的循环几乎可以通吃。2.3 容易被忽视但别跳过的考点图、栈、堆、位运算热题 100 里有几个考点占比不大但出现频率不低很多人在第一轮刷题时容易把它们跳过等面试才发现躲不过去。我说的就是图论、栈、堆和位运算。图论相关的题在热题 100 里不多但都比较经典比如岛屿数量矩阵 DFS、腐烂的橘子多源 BFS、课程表拓扑排序。这些题的核心是“不管图怎么给你先用邻接表或方向数组把邻接关系抽象出来再套 BFS/DFS 的模板”。栈相关的题主要考单调栈和表达式解析前者解决接雨水、柱状图最大面积这类题后者对应基本计算器等括号处理问题。堆则集中在 TopK 问题、合并 K 个有序链表、数据流中位数考察的是对优先队列的理解。位运算在热题 100 里属于“小而美”的存在比如只出现一次的数字这类题用异或操作可以写出非常优雅的解。这类题工作量不大但性价比极高——因为很多候选人没准备到位运算你掌握透彻的话面试时反而能形成差异化优势。3. 三道热搜题三个万能模板3.1 994 腐烂的橘子多源 BFS 就得这么写腐烂的橘子是热题 100 里 BFS 题型的代表也是很多同学第一次接触“多源 BFS”这道坎。题目给你一个二维网格1 代表新鲜橘子2 代表腐烂橘子0 代表空位腐烂橘子每分钟会污染上下左右相邻的新鲜橘子问最少几分钟后所有橘子都腐烂如果做不到就返回 -1。拿到这题的第一反应可能是对每个腐烂橘子分别做 BFS然后再取最大值。这个思路能解但会重复遍历很多格子不是最优解。标准做法是把所有初始腐烂的橘子都当作“第一层”同时放进一个队列里然后一层一层往外扩展。这就是“多源 BFS”——把多个起点当成一个整体做层序遍历。from collections import deque def orangesRotting(grid): m, n len(grid), len(grid[0]) q deque() fresh 0 for i in range(m): for j in range(n): if grid[i][j] 2: q.append((i, j)) elif grid[i][j] 1: fresh 1 if fresh 0: return 0 minutes 0 directions [(1, 0), (-1, 0), (0, 1), (0, -1)] while q and fresh 0: for _ in range(len(q)): x, y q.popleft() for dx, dy in directions: nx, ny x dx, y dy if 0 nx m and 0 ny n and grid[nx][ny] 1: grid[nx][ny] 2 fresh - 1 q.append((nx, ny)) minutes 1 return -1 if fresh 0 else minutes这段代码里有三个细节值得注意。第一初始化时同时把腐烂橘子入队并统计新鲜橘子数量这样可以在 BFS 过程中实时判断是否还有新鲜橘子避免全部遍历完再检查。第二外层循环用for _ in range(len(q))而不是while q这是实现“按层扩展”的关键每扩展一层minutes才加一而不是每个节点加一。第三遍历前先判断fresh 0直接返回 0这个边界条件不处理的话遇到“一开始就没有新鲜橘子”的测试用例就会出错。这道题的时间复杂度是 O(m×n)因为每个格子最多被访问一次空间复杂度最坏情况也是 O(m×n)因为队列里可能同时存放大量腐烂橘子。面试时如果被问到“能不能优化”你要知道在网格规模的约束下O(m×n) 已经是最优复杂度了往这个方向想基本就是在挖坑。3.2 073 爱吃香蕉的狒狒二分答案的套路爱吃香蕉的狒狒LeetCode 875是热题 100 里“二分答案”类题目的经典模板。题目说的是有一排香蕉堆每堆数量不同狒狒每小时吃一堆里的 K 根香蕉如果这一堆少于 K 根就全吃完并且这一小时不换堆火车会在 H 小时后到问最小的 K 能让她在 H 小时内吃完所有香蕉。这类题有个统一的识别特征题目让你求一个“满足条件的最小值或最大值”而这个值的可行域是单调的——K 越大吃完所有香蕉所需的小时数越少。遇到这种结构直接暴力从 1 试到最大堆数量当然能过但数据量一大就会超时用二分查找去逼近答案才是标准解法。def minEatingSpeed(piles, h): left, right 1, max(piles) def can_finish(k): hours 0 for pile in piles: hours (pile k - 1) // k # 向上取整 return hours h while left right: mid (left right) // 2 if can_finish(mid): right mid else: left mid 1 return left这个模板的精髓有两点。第一can_finish(k)这个辅助函数的实现决定了二分能不能正确收敛。计算某堆香蕉需要几小时时(pile k - 1) // k是向上取整的标准写法比math.ceil(pile / k)要快而且避免了浮点精度问题。第二注意二分的区间设计左边界是 1每小时至少吃 1 根右边界是max(piles)因为每小时吃超过最大堆数量的香蕉没有意义时间也不会再减少当can_finish(mid)为真时说明速度够快可以让右边界往左收缩去找更小的可行值但要注意right mid而不是mid - 1因为mid本身可能就是答案反之速度不够时left mid 1。时间复杂度的计算也很有讲究二分外层是 O(log(max(piles)))内层检查函数对每个堆做一次计算是 O(n)总复杂度是 O(n log(max(piles)))。面试官问到复杂度时如果能答到这个层面并且把“为什么对数部分是跟着堆的最大值走”说清楚说明你是真懂了二分答案而不是背了个模板。3.3 基本计算器括号类表达式解析的关键基本计算器LeetCode 224在热题 100 里属于“栈”这个分类题目给你一个字符串表达式包含加减运算和括号以及空格要求你算出结果。这题表面是数学问题实际考的是你用栈处理嵌套结构的能力。核心思路只有一个把括号拆开把减号当成“负号”来用。遇到左括号时把当前结果和括号前的符号保存到栈里进入括号后重新累积结果遇到右括号时把括号内的结果乘以括号前的符号再和栈里存的外层结果相加。整个过程中不需要处理乘除所以代码可以写得比较精简def calculate(s): stack [] num 0 sign 1 result 0 for ch in s: if ch.isdigit(): num num * 10 int(ch) elif ch : result sign * num num 0 sign 1 elif ch -: result sign * num num 0 sign -1 elif ch (: stack.append(result) stack.append(sign) result 0 sign 1 elif ch ): result sign * num num 0 result * stack.pop() # 乘上括号前的符号 result stack.pop() # 加上括号外的累加结果 if num: result sign * num return result我看过很多人在这个题上踩坑最常见的错误有两个。一个是漏掉对空格的处理代码里遇到空格什么都不做就行这个题不像某些表达式题要求你维护 token 流空字符跳过即可另一个是处理多位数时忘记num num * 10 int(ch)这个累加逻辑导致遇到两位以上的数字就算错。此外所有对result sign * num的操作之后都要把num归零否则下次读到数字时会叠加进旧值。这题的难度在于你需要把“符号状态”和“数字状态”分开管理想清楚每个字符出现时哪些变量需要更新、哪些需要重置。一旦想明白了你会发现这类“带括号的表达式”题都是同一个套路以后遇到带乘除、带幂运算的变种核心仍然是“用一个栈保存括号边界处的上下文状态”。4. 刷题计划怎么排三轮刷题法4.1 第一轮按专题分类刷不求快很多人刷热题 100 的第一轮就犯一个错误按照题号顺序从 1 刷到 100。题号顺序不等于知识体系顺序如果你今天刷一道链表题、明天刷一道 DP 题、后天又跳回数组题你的大脑很难在这么跳跃的输入中建立模式识别刷完一轮下来感觉就是“每题都是新题”。第一轮的正确打开方式是把热题 100 按考点分类同一类型集中刷。比如连续三天只刷双指针和滑动窗口你会在第三天突然发现“诶这题和昨天那道题分析的思路一模一样”。这种“顿悟感”就是专题训练的价值——它迫使你在短时间内大量重复同一种思维模式直到形成肌肉记忆。我自己的节奏是每天 2 到 3 题一个专题大约花 4 到 5 天整个一轮下来差不多 6 到 8 周。别嫌慢第一轮慢是正常的慢是在积累模式库。这一轮里有个“时间盒”原则一道中等题最多给自己 45 分钟到 1 小时超过就直接看题解但看完题解不能一走了之——合上题解自己重新把代码写一遍然后隔天再写一遍。你必须把“理解别人的解法”变成“自己能独立复现”才算真正掌握这道题。4.2 第二轮乱序混刷模拟真实面试第一轮按专题刷完之后你以为自己对热题 100 已经了然于胸实际上这时候最危险——因为你知道当前在刷什么专题看到题目自动就往这个专题的思路靠。真实面试根本不会告诉你这道题属于哪个专题所以第二轮的核心动作是“去标签化”。具体做法把热题 100 里面的中等题和困难题打乱顺序每天随机抽 3 到 4 道出来做像模拟考试一样不看分类标签。做的时候给自己限时一道中等题控制在 45 分钟以内困难题放宽到 90 分钟每个题做完之后要做的第一件事不是看题解而是复盘“我一开始是怎么想方向的”“我卡在哪个环节”“如果重新再做一遍第一步能不能更快地定位到正确思路”。这就是在练面试时最重要的能力——从陌生题目里快速识别模式。第二轮还有一件重要的事写复杂度分析。每道题做完不管对错都要写出时间复杂度和空间复杂度并且试着和面试官一样追问自己“能不能优化”。这个习惯如果不刻意练面试时很难答得严谨。4.3 第三轮错题重刷和模拟面试第三轮的量级不用太大重点放在“错题重刷”和“弱点补齐”上。我推荐一个很朴素但有效的办法维护一个错题清单记录你第一轮和第二轮中没做出来、超时、或者看了题解才写出来的题。第三轮就是把这份清单从头到尾再过一遍原则上错题必须做到“不看题解、限时完成、一遍通过”。这个阶段也可以开始用 LeetCode 的“模拟面试”功能或者自己给自己安排 60 到 90 分钟的高压做题时间题目从热题 100 中随机抽取。你可能觉得平时一对一刷题和限时模拟没什么区别但真到了计时器滴答作响的时候你的编码速度和心理状态会完全不同。提早适应这种压力面试时才能稳住不慌。5. 常见问题与避坑实录5.1 “刷了忘、忘了刷”到底怎么破这是我在各个刷题群里看到被问得最多的问题。今天会做的题过两周再看连题意都要读半天。这种情况太正常了因为算法题的记忆不是线性记忆它依赖的是“场景 模式”的联想。你第一次做对可能只是记住了这道题的答案过两周忘记是因为你并没有为这道题建立足够的“提取线索”。我的解法有两个。第一是空间间隔重复每道题做完后在第 1 天、第 3 天、第 7 天、第 30 天各回头重做一次。不是看一遍题解就完事而是真正重新在代码编辑器里写一遍。第二是“用自己的话写题解”给每道题写两三行注释不用复杂就写“这题的核心思路是什么、用了什么数据结构、边界条件是什么”。比如腐烂的橘子那题你可以写“多源 BFS注意层数计时和 fresh 提前返回”。这些注释是你自己的“提取线索”比抄别人的题解有用十倍。还有一个坑是过度依赖题解。很多人做题没思路就立刻翻题解看完恍然大悟然后觉得自己“会了”这其实是虚假的掌握感。我的建议是至少给自己 30 分钟的独立挣扎时间实在做不出来再看看完之后必须经历“合上题解、重新自己写”这个过程。否则你会陷入“看题就会、做题就废”的循环刷了一百题最后面试一道变题就暴露了。5.2 周赛要不要参加热词里提到了周赛 430正好聊聊这个话题。LeetCode 每周一场周赛四道题难度递增。很多刷题者在准备期间会在“要不要参加周赛”之间摇摆。我的态度很明确参加但要摆正心态。周赛最大的价值不是检测你的名次而是模拟“限时 陌生题 压力环境”的真实战场。平时刷题可以暂停想一会儿可以上网查周赛不行你必须连续集中注意力一个半小时这种高压状态不练是不会自动适应的。但周赛题目的难度普遍比热题 100 的平均难度高尤其是第三四题经常涉及较冷门的技巧做不出来一点不丢人。我的建议是把周赛当成“体检”而不是“主课”。每次做完之后复盘一下比如这次第一题花了多久、第二题卡在哪一步、第三题涉及的算法我之前见没见过。如果发现某个模式在热题 100 里也出现过但你没能快速识别那就回到对应的专题去补。我见过有些朋友周赛分数涨了但面试题还是做不好原因就是他把精力全放在刷周赛冷门难题上反而忽略了热题 100 的基础模式本末倒置了。5.3 最容易忽略的面试细节最后这部分说几个刷题之外、但直接影响面试表现的细节都是我踩过的坑或者见过别人踩的坑。第一个是手写代码的熟练度。很多面试现在用线上编辑器但也有不少白板面试和视频面试。如果你习惯了自动补全、语法提示和快速格式化手写代码时可能会突然发现自己的代码缩进混乱、变量命名随意、甚至写不完整。建议在准备面试前每天选一两道热题 100 的题目在纯文本编辑环境下手写一遍不要求字体漂亮只要求逻辑完整、接口正确。第二个是边界条件的“常规安检”。很多人在写题时把主逻辑调通了就万事大吉等测试用例一跑才发现空输入没处理、单节点链表没处理、负数和零的情况漏了、数组越界了。热题 100 里很多题的测试用例会专门布置这些陷阱。我自己的习惯是任何题目写完主逻辑后立刻在代码开头检查四种情况空输入、最小规模输入、最大规模输入、全相同输入。这四关过了大部分隐藏的边界坑都能被提前踩掉。第三个是沟通表达能力。面试算法题不仅考察你写不写得出来还考察你能不能边说边写。平时刷题时最好养成习惯写出思路后用一句话表达“我打算用什么方法解决复杂度是多少”然后边写代码边解释每一步的目的。这需要练习但练习材料现成的——热题 100 里随便抽一题你都能对着手机录两三分钟的视频回看自己表达得是否清楚。5.4 复盘到最后留两个实用小技巧一个是给自己的进度做可视化记录。我建议用一张简单的表格记录每道题的刷题日期、是否独立完成、用了多长时间、核心思路、错在哪一步。这张表不是为了给别人看是为了让你自己一眼看出“哪个考点密集出错”“哪类题目前花费时间过长”从而更精准地决定下一轮把时间花在哪。另一个是善用题目的“变体练习”。把热题 100 里做过的题稍微改一点条件看看自己还能不能解。比如腐烂的橘子改成“可以斜着传播”爱吃香蕉的狒狒改成“每小时可以吃两堆中较小的一堆”基本计算器改成“加入乘除运算”。不需要真的都写出来脑子里过一遍思路就行。这样做的价值在于面试时遇到的原题概率其实不高但你练习过的“变体适应力”才是真正让你在不同包装下认出核心套路的底气。
返回列表