☰
LeetCode Top 100高频题完整刷题指南:从分类到规划到复盘
2026/10/1 22:32:41 网站建设 项目流程

秋招那阵子,我每天都在刷题软件里泡到凌晨。刷了大概三四百道题之后回头复盘,发现真正让我在面试里站稳脚跟的,反而是反复吃透的那一小批高频题。后来我把 LeetCode 的 Top 100 高频题单扒出来对照了一遍,结论很直接:这 100 道题,就是大厂算法面试的骨架。它不是最全的题单,但绝对是最值得先啃的题单。

很多准备面试的朋友一上来就追求刷题数量,觉得“我刷够 500 道肯定稳了”。但以我自己的经历和身边拿到 offer 的同学的情况来看,效率最高的路径其实是把 Top 100 里的每一道题都做到“闭着眼能默写核心思路”的程度。今天我就把这份完整指南整理出来,从题目分类、核心知识点,到具体怎么排刷题计划、怎么复盘,都掰开揉碎讲清楚。不管你是刚起步准备秋招,还是刷到一半感觉瓶颈明显,这篇文章都适合你。

1. Top 100 高频题到底在考什么

先说一个很多人没意识到的事情:LeetCode 官方 Top 100 榜单并不是随机挑 100 道热门题,它是根据真实面试中题目出现频率、讨论热度、题型覆盖度综合排出来的。换句话说,这 100 道题背后,对应的是面试官最爱考的那批算法模型。

我在整理题单的时候,把这 100 道题从头到尾过了一遍,按考察的数据结构和算法维度做了个分类统计,结果大致如下:

题型类别数量占比典型代表
双指针 / 滑动窗口约 15%三数之和、无重复字符的最长子串
二叉树遍历与递归约 18%二叉树的中序遍历、最大路径和
动态规划约 20%爬楼梯、编辑距离、打家劫舍
哈希表与数组技巧约 15%两数之和、字母异位词分组
栈 / 单调栈约 10%有效括号、每日温度
深度优先 / 广度优先搜索约 12%岛屿数量、单词接龙
链表操作约 10%反转链表、合并 K 个升序链表

这个比例本身就在传递信息:面试官不是要考你会不会某个冷门算法,而是看你能否用最常见的几种数据结构和算法思想解决实际问题。链表、二叉树、哈希表、双指针、动态规划这五样占掉了 Top 100 里七成以上的题目,这才是你真正要投入时间的重点。

1.1 为什么是这 100 道题

我见过不少同学绕开高频题,专门挑一些偏题怪题刷,理由是“大家都刷的题,面试官肯定出变种”。这个想法我一向反对。高频题之所以高频,是因为它们的算法思想可以迁移到大量变种题里。你吃透了“两数之和”的哈希表解法,后面遇到三数之和、四数之和、和为 K 的子数组,本质上都是同一套思路在扩展。

Top 100 真正的价值在于用有限的题目覆盖尽量多的算法模型。每道题都是一个锚点,把你对这个知识点的理解固定下来,之后遇到同类型的题目,再在这个锚点上做延展。这比漫无目的地刷 300 道题要踏实得多。

1.2 面试官视角里的高频题

站在面试官的角度,他们考察算法题的核心指标其实就两条:第一,“这个候选人能不能把一个实际问题抽象成算法模型”;第二,“在分析复杂度和优化空间的时候,他有没有清晰的思路”。所以高频题里那些一题多解的题目特别重要,比如两数之和,暴力解、哈希表解、排序加双指针解,三种方案复杂度完全不同,这类题目是最能区分候选人不带盲区的方式。

我后来跟一位参与过校招面试的工程师朋友聊过,他说他们出题基本就是这么个逻辑:先出一道高频题的基础版本,确认你能写出来,然后立刻加一个变化条件,看你现场怎么拆解。如果你对基础版本的思路理解停留在“背模板”层面,一变条件就露馅。所以刷 Top 100,不要只记解法,更要理清每种解法的适用边界。

2. 刷题前的必备基础:复杂度分析和常用数据结构

很多人上来就开刷,写了两道题就被卡住,然后跑来问我“是不是我智商不够”。其实绝大多数时候不是智商问题,而是前置的基础概念没补齐。Top 100 里大部分题目的最优解都依赖你对时间复杂度和空间复杂度的精确判断,以及对常用数据结构特性的熟悉程度。

2.1 时间复杂度:决定你的解能不能过面试

面试中讨论复杂度,基本就是在讨论算法的“档次”。O(n²) 的解通常谁都能想到,但面试官期待的是你能主动优化到 O(n log n) 甚至 O(n)。举一个最典型的例子——三数之和。暴力三重循环是 O(n³),面试的时候你写这个基本就挂了,哪怕能跑,面试官也会觉得你连最基本的复杂度优化意识都没有。而排序加双指针的做法是 O(n²),这才是面试里能拿高分的方案。

我自己在准备的时候,每做完一道题都会在题解区的顶部写清楚三行信息:时间复杂度、空间复杂度、以及“为什么这个复杂度是当前的最优解”。这个习惯帮我建立了很强的复杂度直觉。后来遇到新题时,我甚至能根据数据规模猜出应该用哪种算法。这几个经验非常实用:

  • n 小于 20,大概率是状态压缩或指数级算法;
  • n 在 1000 左右,O(n²) 的动态规划通常可行;
  • n 到 10 的 5 次方,基本就要上 O(n log n) 或 O(n) 的解法;
  • 涉及有序数组且要查边界,优先考虑二分。

2.2 哈希表:空间换时间的祖师爷

Top 100 里的题,应该有一半以上用到了哈希表。两数之和、字母异位词分组、无重复字符的最长子串、最小覆盖子串,这些题的核心操作本质上都是“在遍历过程中快速判断某个元素之前是否出现过”。哈希表的查询和插入平均都是 O(1),是这类场景的天然优势选项。

我做了个小总结:凡是题目里出现“找一段子数组/子串,满足某个条件”,又要求复杂度在 O(n) 以内的,百分之八九十都要用哈希表配合前缀和或滑动窗口。比如和为 K 的子数组,暴力做要 O(n²),但是维护一个前缀和哈希表,时间复杂度直接降到 O(n)。这就是空间换时间的典型案例,用额外的哈希表存储,换取时间的指数级下降。

2.3 栈和单调栈:处理括号与“下一个更大”问题

栈在 Top 100 里的出场率被很多人低估。有效括号是栈的经典应用,而每日温度、柱状图中最大的矩形这些题,则需要用到单调栈技巧。单调栈的核心思想是“及时剔除永远不可能成为答案的候选元素”,这样每个元素最多入栈一次、出栈一次,整体复杂度 O(n)。

使用单调栈的关键点在于确定栈内元素的单调性(递增还是递减)以及弹出时的结算逻辑。这里想重点提醒一句:这类题目看着套路,但你如果只背代码不画图,面试现场很容易在边界条件上翻车。我建议你手写的时候一定要配合具体的例子把栈的变化过程画出来,确认弹出条件没有漏掉相等的情况。

2.4 二叉树:递归是绕不开的基本功

二叉树相关题目在 Top 100 里占了差不多五分之一,这个比例非常高。最大深度、验证二叉搜索树、二叉树的最近公共祖先、路径总和系列,核心都是递归。递归的思路其实一句话就能讲清楚:把大问题拆成“当前节点要做的事”和“递归地去处理子树”。

很多初学者卡在递归,是总在脑子里试图展开每一层的调用过程,这其实会让思路完全乱掉。正确的方式是默认函数已经帮你处理好了子树,你只需要定义清楚当前节点的逻辑和递归的返回条件。用这种信任递归的方式做题,二叉树题目的难度瞬间降一个等级。

3. 实操路径:把 Top 100 拆成一个可持续执行的刷题计划

很多人刷题坚持不下去,不是因为懒,是因为计划不合理。有的人每天随机挑题,今天一道 hard,明天一道 easy,做不出来就挫败,做出来了又觉得太简单没收获。这样刷下去,效果自然大打折扣。我根据自己的实践经验,整理了一套分阶段的刷题计划,整体周期在 8 到 10 周左右,每天保证 2 到 3 小时,周末可以适度加量。

3.1 阶段一:按数据结构逐个击破(第 1-3 周)

这个阶段的目的不是追求刷题数量,而是把每个数据结构的核心解题模型建立起来。建议顺序是:数组与哈希表、链表、栈与队列、二叉树、图。每一类题型集中刷 7 到 10 道题,做到彻底吃透。

以链表为例,我建议按这个顺序刷:反转链表、合并两个有序链表、环形链表、删除链表的倒数第 N 个结点、两两交换链表中的节点、排序链表、合并 K 个升序链表。这几道题从“单个指针操作”到“递归与分治”,难度一层层抬升。每一道都值得在纸上画图模拟指针的走向,尤其注意 prev、cur、next 三个指针的衔接顺序。在实际操作中,最让我记忆深刻的教训是反转链表这类题,用迭代法白板手写时很容易漏掉保存 next 指针这一步,这是新手最常见的失误,一旦漏掉,链表的遍历就断了。

二叉树阶段,则从层序遍历开始,再到前序/中序/后序的递归与迭代实现,然后是构造二叉树、二叉树展开为链表,最后是那些结合 DFS 回溯思想的路径问题。这里我还想专门提醒一下:千万别小看“验证二叉搜索树”这道题,它的陷阱在于只检查当前节点与左右孩子的值是不够的,必须维护每个节点的上下边界。面试里这道题稍加变形,就足够筛掉一大批人。

3.2 阶段二:主攻动态规划与双指针(第 4-6 周)

动态规划是 Top 100 里最拉分的部分,没有之一。新手接触动态规划,我强烈建议按一个固定的分析框架来思考,我自己给它起了个名字叫“五步法”:

  1. 明确 dp 数组的定义,以及每个下标代表什么意思;
  2. 推导状态转移方程,找到大问题如何由小问题组合而成;
  3. 确定初始化条件;
  4. 确定遍历顺序(这直接决定了状态转移是否正确);
  5. 用一个小例子手动推演一遍,确认答案是自洽的。

以“爬楼梯”为例,dp[i] 表示爬到第 i 阶有几种方法,转移方程是 dp[i] = dp[i-1] + dp[i-2],初始值 dp[1]=1、dp[2]=2。就这么简单,但它的思想能一路延伸到打家劫舍、零钱兑换、最长递增子序列。这阶段的核心目标就是积累“一个最优子结构对应一类题目”的直觉。再往后到编辑距离、最长公共子序列这类二维 dp 时,画表格就变得至关重要了,表格能帮助你直观理解每个格子依赖的方向,搞懂了这些,后续刷 hard 题才不至于无从下手。

双指针技巧这个阶段的重点是滑动窗口的模板。无重复字符的最长子串、最小覆盖子串、找到字符串中所有字母异位词,这三道题就是滑动窗口的三件套,难度递增,但框架是统一的:移动右指针扩大窗口,调整左指针缩小窗口,同时保证窗口内数据符合题目约束条件。这个模板在面试里的出现频率极高。

3.3 阶段三:真题实战与限时模拟(第 7-10 周)

最后这个阶段,核心就两件事:限时做题和复盘总结。我会把 Top 100 里标记为 hard 的题目,以及那些需要综合多个算法思想的题目,拿出来做专项强化。比如基本计算器这种题,它就是把栈、运算符优先级、字符串处理全部揉在一起,非常典型的综合题。这阶段做题时,追求的是白板写代码的准确度,而不是 IDE 里的补全调试。

一个关于基本计算器这类表达式题目的经验:处理字符串数字时,要注意“数字可能有多位”,需要用一个变量累积,每次读到一个数字字符时执行 num = num * 10 + (c - '0'),只有遇到运算符或边界时,才会把当前累积的数字入栈并重置。这个细节看着小,但考试时极其容易出错。

LeetCode 每周的周赛在这个阶段我会建议你参与一下,比如最近结束的周赛 430,题目风格就非常接近真实大厂面试题,参加周赛的意义在于训练自己在有限时间内快速审题和切换算法的能力,分数反而不是重点。真实面试里你不会有太多时间反复琢磨一道题,限时训练的临场感会帮你更早适应那种高压状态。

4. 关键题型深入拆解:从题目到解题模板

刷题到了一定数量,你会发现一个特别有意思的现象:题目千变万化,但解题套路其实高度相似。高频考点背后的“模板思维”才是核心武器。下面我挑几类 Top 100 里最有代表性的题型,展开说说背后的解题模板。

4.1 路径类问题:从二叉树路径到矩阵路径

Top 100 里路径问题出现的密度非常大。二叉树的最大路径和、路径总和系列、矩阵中的不同路径,都和“路径”这个概念相关,玩法却完全不同。二叉树最大路径和是一个经典题目,它的关键在于理解:一条路径只能从一个节点走向左右两侧各一边,不能同时走两边之后再拐回来。所以递归返回值应该代表“从当前节点出发能获得的最大单边路径和”,而全局答案要用一个变量维护“当前节点作为拐点时,左右加上自身能构成的最大和”。

矩阵中的不同路径则是动态规划的基础格式,dp[i][j] 表示从起点走到当前位置的路径数,转移方向是“只可能从上方或左方来”。这里如果想做空间优化,还可以把二维 dp 压成一维,滚动数组的方式值得好好体会。路径类题目这么重要,是因为他们在考一个本质能力:能否把一个遍历过程抽象成递推关系。

另外必须提一下岛屿数量这类“网格图上的搜索”问题,它实际上是路径问题的变体,用的是 DFS 或 BFS 把一整块连通的区域标记掉。这个题的思想非常简单,但极其高频,面试中经常以各种外壳出现,比如被围绕的区域、岛屿的最大面积。我用一个不太恰当但很形象的比喻:这类题的解法,就像你在纸上涂色,遇到水坑就把整个水坑填满,标记过的位置不用再走第二次。

4.2 区间类问题:合并、插入与重叠

区间类题目在面试中出现频率也很高,但很多人容易忽略它们的共同套路。合并区间是其中最基础的一道题。核心思路是先按区间起点排序,然后遍历所有区间,如果当前区间与结果集最后一个区间重叠,就合并;否则直接加入新区间。这个解法的时间复杂度是排序的 O(n log n),空间复杂度 O(log n) 到 O(n),取决于排序实现。

区间类题目保险做法是:遇到任何区间题,先想想“排序能不能帮上忙”。很多看起来复杂的区间问题(比如会议室 II、插入区间),排序然后再做一次线性扫描往往就是最优解。排序在这里的意义是把无序的区间整理成有规律的序列,后续的操作就有了确定性。

4.3 子串与子数组问题:前缀和的思想

子数组和子串问题是一个大类,两数之和、和为 K 的子数组、无重复字符的最长子串、最小覆盖子串,全属于这个分类。其中前缀和是一个经常被低估的利器。所谓前缀和,就是开一个数组 preSum,preSum[i] 表示原数组前 i 个元素的和。这样一来,任意子数组的和都能用 preSum[j] - preSum[i] 在 O(1) 时间内得到。

当题目要求“和为 K 的子数组个数”时,单靠前缀和做暴力枚举依然是 O(n²),真正把复杂度降到 O(n) 的是“前缀和加哈希表”。遍历数组时,用哈希表记录每个前缀和出现的次数,每到一个位置,只需要查一下 preSum - K 在哈希表里出现的次数,就能快速得知以当前位置结尾的合法子数组有多少个。这个搭配是我认为 Top 100 中最经典、最值得反复揣摩的组合。

4.4 图论高频模型:DFS/BFS 与拓扑排序

Top 100 里纯图论的题不算多,但一旦出现,往往是决定面试印象分的关键题目。课程表一到课程表二,这两道题就是拓扑排序的标准应用。你只要抽象出“选修先后关系就是有向边,要找出一种不违反依赖的执行顺序”这个模型,解法就呼之欲出了:统计每个节点的入度,入度为 0 的节点先做,做完之后把它指向的节点的入度减 1,再次找出新的入度为 0 的节点,循环往复。

如果入度减完后仍然有节点入度不为 0,说明图里有环,也就意味着课程安排无解。这个判环逻辑在无数死锁检测、任务调度问题里都会用到。DFS/BFS 的基础则体现在单词接龙这类最短路径问题上,由于边的权值相同,BFS 天然是解这类问题的最佳方案,第一个到达终点的那条路径一定是最短路径。

5. 高效复盘与记忆:如何让刷过的题真正长在身上

相信我,刷题最重要的一环绝对不是“做”而是“复盘”。我认识不少人,每天信誓旦旦刷三道题,坚持两个月,但是拿到新题还是没思路。一问原因,往往是做完一提交通过,代码一关就再也不看了,这样刷一百道题和刷十道题的区别,其实不大。

5.1 建立模板笔记而不是抄题解

我在刷题时维护了一个自己的“算法模板库”,方式很简单:不是把题解代码抄一遍,而是把解题思路抽象成带注释的模板。比如滑动窗口,我记录的模板长这样:

  • 右指针每次移动一步,加入窗口并更新状态;
  • 当窗口不再满足条件时,收缩左指针;
  • 每次移动右指针之后,尝试更新最终答案。

以这种“流程化描述”的方式记录,而不是死记硬背具体题目代码,遇到新题时,我做的第一件事就是去模板库里检索,看有没有能匹配的流程框架。这种匹配能力决定了解题速度,也是刷题最核心的竞争力。

对于哈希表相关的题目,我会额外记录“什么场景该用哈希表”:需要在遍历中记住历史信息的;需要检查元素重复的;需要快速统计频率的。这些都是 Top 100 里出现频率极高的需求。

5.2 复习节奏:间隔重复的记忆曲线

刷题最大的天敌是遗忘。今天会做的题,两周后可能完全想不起解法。如果这是你的痛点,我的建议是建立复习卡。每道做完的题,我会记下三个信息:核心思路(一句话)、踩坑点、以及下次复习的日期。复习日期采用“第 1 天、第 3 天、第 7 天、第 15 天”的间隔模式,循环回看。

这个操作看起来不起眼,但实际效果出奇地好。根据艾宾浩斯遗忘曲线的原理,在快要遗忘的时间节点主动回顾,记忆留存率会明显高于盲目赶进度式的刷题。我后来基本可以做到:Top 100 里的每一题,看到题目描述,就能在两三分钟内说出核心思路和复杂度,这就是间隔复习的功劳。

5.3 错题分类:比起数量更看重归因

每一道做错的题,我都会做一个简单的分类:是思路没想出来,还是想到了但代码没写对?是某个 API 不熟悉,还是状态转移方程写错了?不要小看这个动作,因为它决定了你下一步该干什么。如果经常是“思路缺失”,那就需要继续补充模板和题型归纳;如果经常是“代码细节出错”,那就该多做白板练习,尤其是手写链表的指针操作、数组的边界条件这类容易出错的地方。

我也见过一种特别常见的情况:明明想出来思路了,但是代码实现时却在一些很基础的语法上卡壳。遇到这种情况,我的建议是多练写代码的熟练度,特别是要动手把链表反转、二叉树遍历这种基础操作写到“肌肉记忆”的程度,面试现场靠临时思考这些基础操作,既浪费时间又容易出错。

6. 面试实战技巧:从刷题到上岸的最后一步

这个环节聊点刷题之外、决定面试表现的东西。我自己走过几场面试之后,最大的体会是:算法题答得怎么样,不只看你会不会做,更看你怎么展现你的思考过程。

6.1 拿到题目后的第一步动作

很多人在面试时,拿到题目就闷头开写,这是一个需要立刻纠正的习惯。正确的第一步动作是“复述题目并确认边界条件”。比如“输入数组会不会为空?数值范围是多少?有没有可能包含重复元素?需要返回下标还是返回元素?”这些问题既能帮你明确输入输出,又能让面试官感受到你思路的严密性。

然后说思路。在动笔之前,先用清晰的语言把你打算用的算法、时间复杂度和空间复杂度告诉面试官。哪怕思路不完美,也要让对方知道你在做有意识的权衡。面试官真正想看到的,是你思考的过程,而不只是一个最终的答案。

6.2 真的卡住了怎么办

面试时卡壳很正常,但不是绝路。我建议你准备一套“僵尸爬虫式”的排查流程,按顺序自问:能不能用暴力法?能不能用哈希表优化?能不能换一种数据结构?能不能先排序?这个流程在一道题上的排查时间也就是一两分钟,但往往能带来新的破局视角。

如果用了这些思路还是解不出来,就大大方方地和面试官沟通你的瓶颈在哪里,比如“我想用动态规划,但状态转移一直推不出来”。大多数面试官会给你提示,因为考察沟通能力本来就是面试的一部分。你表现的越是冷静分析问题,而不是慌乱跳步骤,面试官越是愿意拉你一把。

6.3 代码质量与边界测试

代码写完不要立刻说“我写完了”。留出一段时间从头到尾检查一次:指针有没有踩到空值?递归有没有退出条件?数组索引有没有越界?循环里的变量有没有更新?尤其是链表类题目,画图核对每一步的指针变化,能帮你避免大量低级失误。

检查完之后,自己举一个小例子在脑子里过一遍流程,然后再举一个边界例子,比如空输入、只有一个元素、全部元素相同的情况。这个动作不仅能让面试官对你的代码质量更有信心,也常常能帮你自己发现一些潜在的逻辑漏洞。

7. 常见问题与排查技巧实录

整理了这么多,最后把大家最常见的困难和踩过的坑集中梳理一下,方便你遇到问题时快速排查。

症状可能原因解决方案
题目见过,但就是想不起解法缺少有效的复盘机制用间隔复习法,按 1/3/7/15 天节奏回看模板笔记
思路正确,代码一堆小 bug边界条件和不变量掌握不牢重点做白板练习,尤其是链表指针和数组索引边界
动态规划永远推不出状态转移方程跳过基础题直接刷中等/困难题先吃透斐波那契、爬楼梯、打家劫舍这三个入门模型
刷了很多题,新题还是没有思路只做题没做题型归纳停止随机刷题,按“模板匹配”方式重新整理高频题
面试一紧张大脑空白平时缺少限时模拟环境参加周赛,或者每天卡 25 分钟做一道中等题
代码没有注释,面试官看不懂思路缺少边写边讲的习惯养成“讲一句核心逻辑,写一行代码”的习惯

其中我想再次强调,动态规划推不出状态转移方程,最根本的原因往往不是数学能力不足,而是你见过的“状态定义方式”样本太少。你去看看零钱兑换、最长递增子序列、编辑距离、跳跃游戏这些题的题解,会发现它们的 dp 数组定义方式完全不同,见得多了,自然能在新题里找到灵感。

另外还有一个特别隐蔽的错误,就是过度写复杂解法。Top 100 里有一些简单题,有时候我也会忍不住想用一个看起来更“高级”的数据结构来解。但其实面试里简单清晰的解法,往往比炫技的解法更讨喜。优先保证思路正确、边界完整,再考虑优化。如果一开始就写复杂解法,很容易写错且不好维护,给面试官留下不好的印象。

最后一个常见问题在 leetcode 讨论区经常见到:刷题时间很长但感觉毫无提升。碰到这种情况,先停下来,不要再刷新题,回头把自己最近 20 道题的题解重新看一遍,检查你是否真的理解了每道题的核心难点和复杂度。如果答案是否定的,慢下来,搞懂它们,再往前走,很可能你就会突然迎来一个突破瓶颈的节点。这也正好呼应了吃透 Top 100 的意义——吃透,永远比做过更重要。比如“爱吃香蕉的狒狒”这道题,虽然不在官方 Top 100 名单里,但它和 Top 100 里的爱吃香蕉的狒狒一样,核心都是二分答案。这就是典型的“做一道题理解一类题”的迁移能力。

说到底,算法面试的准备,比拼的是你能否稳定地输出自己对常见模型的深度理解,而不只是知道题目怎么解。把 Top 100 真正啃透,再配合上面提到的复盘节奏和面试技巧,你的算法面试基础就已经非常扎实了。祝你刷题愉快,面试顺利过关。

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

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

立即咨询