☰
LeetCode Top 100刷题指南:算法面试高频题单与三轮复习法
2026/10/1 20:16:20 网站建设 项目流程

如果你把“刷完 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 100

2.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))为例,具体做法分四步:

  1. 维护两个变量:sign = 1表示当前数字前面的符号,result = 0累加当前括号层内已经计算出的结果。
  2. 当遇到+或-时,更新sign为 1 或 -1。
  3. 当遇到数字时,把连续的数字字符转换为整数,累加到result,即result += sign * num。
  4. 当遇到左括号时,把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,标签:二分查找
  • 核心思路:二分答案 k,check 函数用向上取整计算总耗时
  • 时间复杂度: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 个圈,你会感谢现在的自己。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询