LeetCode Top 100刷题指南:算法面试高频题单与三轮复习法

发布时间:2026/10/1 20:16:26
LeetCode Top 100刷题指南:算法面试高频题单与三轮复习法 如果你把“刷完 LeetCode”当作面试准备的目标那你大概率会在第三周就放弃。1500多道题每道题刷三遍时间根本不允许。真正高效的做法是把目光聚焦在一份足够可靠的车轮清单上LeetCode Top 100 面试高频题。这套题单几乎就是大厂算法面试的“最小必要集”数组、链表、树、动态规划、字符串、栈与队列全覆盖很多原题换个包装就出现在面试里。本指南就是围绕这份Top 100把我的筛选逻辑、分类方法、重点题目拆解、刷题节奏和踩坑经验完整写出来适合准备校招、跳槽、或者想系统提升算法能力的你。1. 刷题之前先把 Top 100 的底层逻辑想清楚1.1 为什么是 Top 100而不是全部 3000 题很多新手容易陷入一个误区刷题数量越多越好。我见过有人一年刷了 500 道面试依然挂掉也有人只刷了 120 道就拿到了不错的 offer。差距不在数量而在“题感”——能不能快速识别题型、调用对应数据结构和算法模板。Top 100 之所以值得优先刷是因为它覆盖了面试中 80% 以上的常见考点链表反转、二叉树遍历、动态规划状态转移、双指针、滑动窗口、回溯搜索、图的最短路。这些题目被反复验证过几乎每家公司的题库里都能看到它们的变体。从时间成本看刷完 100 道题并吃透正常节奏下需要 8 到 10 周。如果直接刷全部题目战线拉长到一年前面的内容早忘了。所谓“完整指南”不是让你把每道题的答案背下来而是建立一套可复用的解题框架。Top 100 就是最好的训练集题量适中、难度递进、标签清晰每一道都能带动一类题的解法。1.2 高频题清单哪里来怎么筛选LeetCode 官方本身就有“热门 100 题”入口但这不是唯一来源。我更推荐综合三类数据来交叉筛选LeetCode 官方的 Top 100 热门题列表作为基础盘。牛客网、知乎、一亩三分地等平台上的面经汇总看哪些题被多次点名。面试高频题库书籍或专栏按公司维度整理的题单。筛选时需要把握几个原则优先选择数据结构和算法标签分布均衡的题目排除一些过于冷门或过时的题目剔除纯数学技巧题比如数论类面试中很少出现把同一考点的题目聚在一起比如链表反转类就有 206、92、25 等选了 206 就要连带做 92。我的做法是先按标签把 Top 100 分成 10 个类每类选 8~12 题再结合面经补充少量变体题最终形成自己的“私房 Top 100”。这样既能保证覆盖面又能防止官方清单里某些题方向重复。1.3 你需要什么基础才能开始不要等到算法基础完美了才启动刷题。你需要的最低限度是懂一门编程语言的基本语法能用数组、字典、指针写简单逻辑知道常见数据结构是什么概念——栈先进后出、队列先进先出、树有根和叶子、图由节点和边构成了解时间复杂度的含义知道 O(n) 和 O(n^2) 的差距。如果你连“递归”都还没搞明白也可以开始但建议先花一周补充基础。推荐路线看 B 站上半小时的数据结构速成或者找一本《算法图解》翻前五章。我不建议一上来就研究红黑树、线段树这类高级结构Top 100 里几乎不会用到真面试中出现的概率也极低。把基础夯实到能流畅写一个递归函数、能分析一层循环的时间复杂度就足够了。2. 按数据结构和算法维度拆解 Top 1002.1 题目分布看看 Top 100 到底考了什么我从自己的私房清单里统计过分布大致如下考点类别题目数量约代表题数组与哈希表22两数之和、最长连续序列链表12反转链表、合并 K 个有序链表二叉树与递归18二叉树的中序遍历、最近公共祖先字符串与双指针12无重复字符的最长子串、回文子串栈与队列8有效括号、基本计算器动态规划16爬楼梯、打家劫舍、最长递增子序列回溯与 DFS8全排列、子集、岛屿数量二分查找4爱吃香蕉的狒狒、搜索旋转排序数组堆与优先队列5前 K 个高频元素贪心与其他5跳跃游戏、会议室可以看出数组、二叉树、动态规划是三大巨头占了差不多一半。如果你的时间非常紧优先保证这三个类别的题刷透。2.2 高频考点优先级排序同样是高频题重要程度并不一样。我按面试中出现的概率和个人成长收益分成三个梯队第一梯队必须吃透每道题要能手写最优解并可讲清思路两数之和、反转链表、有效的括号、二叉树的中序遍历、无重复字符的最长子串、爬楼梯、岛屿数量、合并两个有序链表、最大子数组和、环形链表。第二梯队熟练掌握看到题能快速想到解法方向LRU 缓存、最长回文子串、编辑距离、滑动窗口最大值、二叉树的最近公共祖先、打家劫舍系列、路径总和系列、寻找两个正序数组的中位数。第三梯队了解思路 能写暴力解面试考到不至于发懵正则表达式匹配、单词拆分、戳气球、天际线问题。这些难题常客较少花费过多时间性价比不高。优先级排序的意义在于面试中 80% 的算法题落在第一和第二梯队。如果你还有两周面试只刷第一梯队就够了如果有一到两个月重点突破前两个梯队只有准备长期备战才需要啃第三梯队。2.3 每类题目的训练方法这里分享一套“同类合并”训练法别一道一道孤立地刷。数组类先做“两数之和”理解哈希表换时间再做“三数之和”学会排序双指针去重然后做“盛最多水的容器”强化双指针移动的贪心逻辑。这类题的核心是“减少枚举量”。链表类先做“反转链表”背诵三指针迭代写法再做“两两交换节点”练递归思维最后做“链表排序”理解归并思想在链表上的应用。链表题的核心是“指针后移前先保存 next”。二叉树类把所有遍历题集中刷一遍——前序、中序、后序、层序然后做“最近公共祖先”“路径总和”等递归应用。核心是搞清楚递归函数的“定义”而不是“过程”。动态规划类从“爬楼梯”“打家劫舍”入手理解状态转移再做“最长递增子序列”学会一维 DP然后做“编辑距离”“最长公共子序列”接触二维 DP最后挑战“正则表达式匹配”。核心是“状态是什么、转移怎么来、边界在哪”。栈与队列类“有效的括号”入门“最小栈”练辅助栈“基本计算器”综合应用。每做完一类题回头总结这一类题的通用模板。比如二叉树递归模板永远是def dfs(node): if not node: return # 前序位置 dfs(node.left) # 中序位置 dfs(node.right) # 后序位置把模板内化成肌肉记忆面试时就能快速写出来。3. 精讲两道“硬骨头”基本计算器与爱吃香蕉的狒狒3.1 基本计算器LeetCode 224栈与状态机的经典配合基本计算器是 Top 100 中难度偏高的栈题也是热搜常客。题目要求实现一个支持加、减、括号、空格的整数计算器。很多人第一次做会被括号嵌套搞得晕头转向其实核心思想只有一条利用栈把“括号前的结果”和“括号前的符号”保存起来遇到右括号时再算总账。以1 (2 - (3 4))为例具体做法分四步维护两个变量sign 1表示当前数字前面的符号result 0累加当前括号层内已经计算出的结果。当遇到或-时更新sign为 1 或 -1。当遇到数字时把连续的数字字符转换为整数累加到result即result sign * num。当遇到左括号时把result和sign压入栈然后重置result 0、sign 1开始处理括号内的表达式遇到右括号时弹出栈顶的prev_result和prev_sign将当前括号内的结果连同符号累加回去result prev_result prev_sign * result。Python 写法如下def calculate(s: str) - int: stack [] result 0 sign 1 num 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 stack else result # 注意这里的实际写法应为result stack.pop() stack.pop() * result # 但常见写法为了可读性先取 sign 再取 prev_result return result上面代码里的elif ch )我故意写了一个容易出错的版本实际应用中建议拆开写避免混淆prev_sign stack.pop() prev_result stack.pop() result prev_result prev_sign * result这个 bug 就是栈顺序问题。压栈时先压结果再压符号弹栈时就要先弹符号再弹结果。很多人直接抄网上代码后出错就是没注意这一点。这道题在面试中的价值在于它考察了面试者对“状态机”的理解——从左到右扫描字符串时必须清楚自己处于什么状态是数字还是运算符还是空字符以及括号优先级如何用栈解决。能够流畅写出来并解释清楚是基础扎实的有力证明。3.2 爱吃香蕉的狒狒LeetCode 875二分答案的思维模型母爱题型“Koko Eating Bananas”是二分查找家族里的名题。题目大意是有一堆香蕉每堆数量已知狒狒每小时最多吃 k 根如果一堆少于 k 根它吃完这堆后这小时就结束给定总时间 H求满足条件的最小速度 k。很多人看到这题会想模拟狒狒怎么吃但直接暴力枚举 k 从 1 到最大堆数量复杂度很高。正确姿势是二分答案k 的取值范围是[1, max(piles)]我们在这个区间内找最小值使得以速度 k 吃完所有香蕉用时小于等于 H。“能否在 H 小时内吃完”的判断函数是def can_finish(piles, k, h): hours 0 for pile in piles: hours (pile k - 1) // k # 向上取整 if hours h: return False return True注意这里计算小时用的是(pile k - 1) // k相当于ceil(pile / k)。然后用二分查找不断缩小范围def minEatingSpeed(piles, h): left, right 1, max(piles) while left right: mid (left right) // 2 if can_finish(piles, mid, h): right mid else: left mid 1 return left这道题的核心思维模型是“答案线性可搜索 判断函数易实现”。很多看似复杂的最优化问题比如求最短天数、最小容量、最大距离都能套用这个模板。面试中如果遇到类似的题目第一时间思考答案区间是什么然后写一个check函数最后二分收窄。我面试时遇到过“在 D 天内送达包裹的能力”和“分割数组的最大值”几乎完全复用这个思路。刷透一道能带出一片。3.3 两道题对面试的启发基本计算器和爱吃香蕉的狒狒分别代表了两种常见的面试状态。前者是“模拟复杂逻辑”考察语言控制和数据结构熟练度后者是“把最优化问题转为判定问题”考察思维模型。这两题一刚一柔刚题要求代码稳健柔题要求思路清晰。我建议把这两道题放在刷题中期来做作为检验成果的试金石。如果你能 30 分钟内写完基本计算器并跑通所有测试用例你的栈和状态机基本功已经过关如果你能 20 分钟内写出二分模板并解释清楚边界条件你的二分查找水平在大多数面试里都不会拖后腿。4. 我的 Top 100 二刷实战路线4.1 三轮复习法从暴力到最优第一轮叫“过题”目标不是做出最优解而是“见过”。每道题先自己想 15 分钟没思路就看题解理解后手写一遍。这一轮节奏最快每天 5~8 题20 天左右覆盖完整清单。第二轮叫“限时写”严格按照面试标准来。每道题给自己 25~35 分钟白板或在线编辑器里写完然后跑测试用例复盘时间和内存。这轮每天 3~4 题30 天完成。重点是把自己的解法与最优解法对比比如两数之和的暴力解和哈希解都要写一遍。第三轮叫“讲题”把每道题当作面试题用说人话的方式讲解思路、复杂度、边界条件甚至主动说出优化过程。我会在电脑前打开录音讲完再回听检查有没有逻辑跳跃。这轮每天 6~8 题两周搞定。三轮下来大部分题目能形成长期记忆。4.2 每日计划与时间分配很多人制定的刷题计划太过理想化比如“每天 10 道题、持续 30 天”。现实是工作或上课已经占用大量时间能保证每天 2 小时刷题就不错了。更合理的方案是“工作日保障 周末突击”工作日每天雷打不动 1.5 小时拆成 45 分钟新题 45 分钟复习旧题周末拿出半天做一次 90 分钟的模拟题组从 Top 100 里随机抽 4 道题限时完成。时间分配上我比较推荐“40% 新题、40% 旧题、20% 面经题”的配比。旧题一定要动手重写而不是“看一遍思路就够了”。好记性不如烂笔头很多题你以为会了真正闭眼写时还是卡壳。不要过分追求每日连续天数别因为一天断了就放弃整个计划。我刷题的时候也经常因为加班中断但只需要第二天补上同样时长即可。坚持的本质是“长期平均投入”而不是“完美连续打卡”。4.3 如何记笔记让题解可检索刷完题不整理等于白刷。我见过不少人的 LeetCode 提交记录里只有代码没有思路。这样三个月后回头复习还得重新读一遍题目。我的笔记格式分三块题号与标签、核心思路一句话、复杂度分析。比如题号875标签二分查找核心思路二分答案 kcheck 函数用向上取整计算总耗时时间复杂度O(NlogM)N 是堆数M 是最大堆香蕉数空间复杂度 O(1)记笔记时不用写长段落要像给别人发即时消息一样简洁。最重要的是“一句话思路”这是面试时最先讲出来的东西。另外我会用标签体系把同类题串起来比如把“二分答案”标到 875、1011、410 这几题上复习时输入标签就能看到所有相关题目建立知识网络。5. 高难扩展周赛 430 与外卡思路5.1 周赛值得打吗如果你已经刷完大半个 Top 100我强烈建议每周参加 LeetCode 周赛。周赛 430 是最近一场比赛虽然每题未必直接对应 Top 100但它的价值在于训练“限时 错题 临场心态”。周赛题目通常覆盖前缀和、枚举、贪心、动态规划、图论等高频考点和 Top 100 有高度重叠。我第一次参加周赛时前三题用了 70 分钟第四题看都没看懂。坚持打了两个月后前三题稳定在 30 分钟内做完。这个进步不是靠刷额外难题获得的而是靠“限时做题”的紧迫感逼出了更快的思路转换能力。如果你时间有限可以只做前三题坚持比分数更重要。5.2 从周赛题回看 Top 100 的考点复用周赛题看起来“新”解法却几乎都是 Top 100 里学过的东西。以周赛 430 为例我记得第一题基本就是“模拟 哈希表计数”这种背景在“两数之和”“有效的字母异位词”里反复出现第二题如果涉及区间合并那灵感就来自“合并区间”。所以打周赛的正确姿势是每场比赛结束后把每道题对应到 Top 100 的某个知识点写一句“这题用到的模板是 XX”。这种回看能帮你跳出“刷过原题才会做”的陷阱。面试中遇到的全新题目本质都是 Top 100 的考点排列组合。你能把新题拆解成旧题就已经赢了一大半。6. 常见问题与避坑实录6.1 刷题过程中最容易踩的 4 个坑第一个坑是“死磕不看题解”。我曾在一道困难题上耗时两天最后发现解法很简单纯粹坏在思路方向错了。建议每题思考时间不超过 30 分钟没思路就立即看题解看懂后合上书自己写一遍效果远好过死磕。第二个坑是“只写一遍就过”。一道题真正掌握的标准是你能在不看任何参考的情况下隔三天还能写出来。我一般会在笔记本上记录“重做日期”一道题重做三遍才算过关。第三个坑是“代码风格随意”。面试时不要写i, sum a[i]这种缩写也不要使用变量名x、y、z。清晰命名、提前写结构、先写注释再写代码这些好习惯必须在刷题阶段养成。第四个坑是“忽视复杂度分析”。能跑通不代表是面试要求的答案。提交通过后再看题解的复杂度很多时候你会发现自己的解法是 O(n^2) 而最优解是 O(n)。要主动追问能不能用双指针、前缀和、哈希表、二分查找来降低复杂度6.2 面试前一周如何做热点冲刺如果下周就面试不要再狂刷新题。正确的做法是回归 Top 100 的高频题按“默写模式”重写一遍。把第一梯队的 20 题、第二梯队的 15 题全部以讲题的方式口头过一遍。同时准备一个“万能套路卡”数组不会做就想想排序后能不能用双指针字符串不会做就想想哈希表或滑动窗口树不会做就想想递归三要素优化时间复杂度就想想空间换时间。这张卡不需要多复杂但要在压力环境下提醒自己。我还习惯面试前重读自己的笔记里“一句话思路”部分60 道题 60 句话花一小时快速过完效果很好。6.3 心态与节奏最后聊聊心态。我不建议把刷题看成“痛苦的修行”而是把它当作“给未来的自己投资”。过程中会经历“今天刷了 5 题明天全忘了”的挫败这在所有人身上都会发生。遗忘是正常的重复才能对抗遗忘。每道题重做一遍理解就深一层。如果你准备的时间只有一个月请一定优先把“链表反转、二叉树遍历、动态规划基础、二分答案”这四块吃透。它们是最核心、最高频、最能稳定得分的部分。Top 100 不是全部但完成它你的算法面试绝对不会慌。我个人在刷完三遍 Top 100 之后的体会是真正拉开差距的不是做过的题量而是你能否在拿到一道新题时快速判断出它属于哪一类并稳定地调用对应模板。这份指南里的分类法、精讲题和三轮复习法都是我自己用时间换来的经验照着走你也能建立起属于自己的高频题解题体系。最后再分享一个小技巧把 Top 100 题目列表打印出来贴在桌边每完成一题就在题号前画一个圈视觉反馈带来的成就感远超过 APP 里的进度条。坚持到画满 100 个圈你会感谢现在的自己。