简介这份资源是面向算法学习者与求职面试者的 LeetCode 热题 HOT 100 题解合集以 C 实现为主适合正在准备技术面试、希望系统刷题巩固数据结构与算法基础的开发者。内容围绕高频考点展开涵盖两数之和的哈希表优化、两数相加的链表进位处理、无重复字符最长子串的滑动窗口以及寻找两个有序数组中位数的二分思路等经典题型每道题均配有可运行的完整代码与复杂度分析。资源为单个 PDF 文件压缩包约 640KB篇幅紧凑便于随时查阅与打印。目前已有 1638 人学习下载说明其在刷题群体中具有一定参考价值。读者可借此快速掌握常见题型的解题模板、边界条件处理与代码书写规范在有限时间内提升刷题效率与面试通过率。1. 从一份“题目加答案”的 LeetCode 热题 100 资源说起如果你正在准备后端、客户端或算法岗面试大概率绕不开 LeetCode 热题 100 这个清单。它把力扣上最高频的 100 道题单独拎出来覆盖数组、链表、哈希、双指针、滑动窗口、二叉树、动态规划、回溯、图论等核心考点。但真正让人头疼的不是“刷不刷”而是刷完之后回头复习时手边没有一份能直接对照的题目加答案。我这次拆的这份资源就是 LeetCode 热题 100 的题目与答案合集以 C 实现为主适合已经能写基础语法、想集中突破高频题的人。它解决的是“题解散落在各处、复习时找不到完整对照”的问题拿来当刷题索引和复盘底稿都行。2. 热题 100 的题目分布与 C 答案组织方式2.1 为什么按题型而不是按题号来组织热题 100 官方列表是按题号顺序排的但真正刷起来会发现相邻题号之间往往没有直接关联。比如第 1 题是哈希表第 2 题是链表第 3 题是滑动窗口第 4 题又跳到二分查找。如果按题号顺序硬刷每道题都要重新切换思维模型效率很低。我一般会把这份资源里的题目按题型重新分组。常见做法是分成这几类哈希与双指针、滑动窗口与子串、普通数组与矩阵、链表、二叉树、图论、回溯、二分查找、栈与堆、动态规划、贪心与技巧。这样分组之后同一类题的解法套路高度相似刷完一道就能迁移到下一道。这份资源本身是按题号顺序整理的但每道题都标注了所属题型标签。我在使用时会先按标签筛选把同一类的题集中刷完再回到题号顺序做交叉复习。下面这张表是我整理出来的题型分布方便你判断自己的薄弱环节在哪。题型分类题目数量典型题目哈希与双指针12两数之和、三数之和、盛最多水的容器滑动窗口与子串8无重复字符的最长子串、找到字符串中所有字母异位词普通数组与矩阵10最大子数组和、合并区间、螺旋矩阵链表10相交链表、反转链表、合并两个有序链表二叉树15二叉树的中序遍历、最大深度、最近公共祖先图论6岛屿数量、腐烂的橘子、课程表回溯8全排列、子集、电话号码的字母组合二分查找6搜索旋转排序数组、寻找两个正序数组的中位数栈与堆8有效的括号、每日温度、数组中的第 K 个最大元素动态规划12爬楼梯、打家劫舍、最长递增子序列贪心与技巧5跳跃游戏、多数元素、颜色分类这张表不是让你按顺序刷而是让你先看清全貌。比如你发现自己二叉树类题目正确率一直上不去那就把 15 道二叉树题集中刷一遍每道题先自己写写完再对照资源里的 C 答案。2.2 C 答案的代码结构与关键注释这份资源里的 C 答案不是只贴一段能过的代码就完事每道题都保留了核心逻辑的注释。我挑一道典型题——LeetCode 994 腐烂的橘子——来说明它的组织方式。这道题是图论里的 BFS 经典题也是热词里出现频率很高的一道。// LeetCode 994. 腐烂的橘子 // 思路多源 BFS把所有腐烂橘子作为起点同时入队 // 每层扩散代表一分钟最后返回总分钟数 class Solution { public: int orangesRotting(vectorvectorint grid) { int m grid.size(), n grid[0].size(); queuepairint, int q; int fresh 0; // 记录新鲜橘子数量 // 初始化腐烂橘子入队统计新鲜橘子 for (int i 0; i m; i) { for (int j 0; j n; j) { if (grid[i][j] 2) { q.push({i, j}); } else if (grid[i][j] 1) { fresh; } } } if (fresh 0) return 0; // 没有新鲜橘子直接返回 0 int minutes 0; int dirs[4][2] {{-1,0},{1,0},{0,-1},{0,1}}; while (!q.empty() fresh 0) { int size q.size(); // 当前层的所有腐烂橘子同时向外扩散 for (int k 0; k size; k) { auto [x, y] q.front(); q.pop(); for (auto d : dirs) { int nx x d[0], ny y d[1]; if (nx 0 nx m ny 0 ny n grid[nx][ny] 1) { grid[nx][ny] 2; // 标记为腐烂 fresh--; q.push({nx, ny}); } } } minutes; // 每处理完一层时间加一 } return fresh 0 ? minutes : -1; // 还有新鲜橘子则返回 -1 } };这段代码的关键点有三个。第一多源 BFS 的起点不是单个节点而是所有腐烂橘子同时入队这样每一层扩散就对应一分钟。第二用fresh变量实时统计剩余新鲜橘子数量避免最后再遍历一遍矩阵。第三循环条件里加了fresh 0如果所有新鲜橘子已经腐烂完就提前退出不用继续空转。参数方面grid是输入的二维矩阵0 表示空格1 表示新鲜橘子2 表示腐烂橘子。返回值是使所有橘子腐烂所需的最小分钟数如果不可能全部腐烂则返回 -1。这道题的时间复杂度是 O(m×n)每个格子最多入队一次空间复杂度也是 O(m×n)队列最坏情况下会存下所有格子。资源里每道题的答案都按这个格式组织先写思路注释再写完整类实现关键变量和边界条件都有行内注释。这样你在复习时不用重新推导直接看注释就能回忆起当时的解法。2.3 如何用这份资源做三遍刷题法第一遍刷题时不要直接看答案。先自己写写完提交如果没过再看资源里的 C 答案。这一遍的目标是“能写出来”哪怕写得慢、写得丑也没关系。我一般会给自己定一个规矩每道题最多想 25 分钟超时就看答案看完之后关掉答案再默写一遍。第二遍刷题时只看题目描述不看答案直接在白板或纸上写核心逻辑。这一遍的目标是“能讲清楚”。写完对照资源里的注释看自己的思路和标准解法差在哪里。如果某道题第二遍还是卡住就在题目旁边标记一个星号。第三遍刷题时只刷带星号的题。这一遍的目标是“能优化”。资源里的答案不一定是最优解有些题只给了最直观的解法。你可以尝试优化空间复杂度或者换一种数据结构重新实现。比如 LeetCode 073 爱吃香蕉的狒狒资源里给的是二分查找解法你可以试着用数学方法推导上界来缩小二分范围。三遍下来热题 100 里真正需要反复看的题不会超过 20 道。这 20 道就是你面试前最后一周的复习重点。3. 把答案跑起来本地编译与在线验证的完整流程3.1 本地 C 编译环境的最小配置这份资源里的答案都是标准 C 代码不依赖任何第三方库只需要一个支持 C17 的编译器就能跑。我一般用 g 直接编译不搞复杂的 CMake 工程因为刷题阶段没必要。# 检查 g 版本确保支持 C17 g --version # 编译单道题的答案假设文件名为 solution.cpp g -stdc17 -O2 -Wall -o solution solution.cpp # 运行可执行文件 ./solution-stdc17指定标准版本因为资源里有些答案用了结构化绑定比如auto [x, y] q.front()C11 编译不过。-O2开启优化刷题阶段其实用不上但养成习惯没坏处。-Wall打开所有警告能帮你发现一些隐蔽的类型转换问题。如果你在 Windows 上用 MinGW 或者 WSL 里的 g 都一样。Mac 上装 Xcode Command Line Tools 之后自带 clang把上面的g换成clang即可。提示资源里的答案都是完整的class Solution没有main函数。本地编译时需要自己补一个main来调用或者直接复制到 LeetCode 在线编辑器里跑。3.2 用 LeetCode 在线编辑器做快速验证本地编译适合批量刷题但单道题验证最快的方式还是直接贴到 LeetCode 在线编辑器里。资源里的每道题都标注了对应的题号你直接搜索题号就能找到原题。操作步骤很简单打开对应题目页面把资源里的 C 答案完整复制到代码编辑区选择 C 语言点击运行。如果编译报错先检查是不是复制时漏了分号或括号。如果运行结果不对先看题目给的测试用例再用自定义输入测边界情况。我一般会额外测三类边界空输入、只有一个元素的输入、所有元素都相同的输入。比如 LeetCode 994 腐烂的橘子边界情况包括全是空格返回 0、没有腐烂橘子但有新鲜橘子返回 -1、只有一个腐烂橘子返回 0。这些边界在资源答案的注释里都有提到但自己动手测一遍印象更深。3.3 用脚本批量提取题目和答案做复习卡片如果你想把这份资源做成 Anki 卡片或者 Markdown 复习笔记可以写一个简单的 Python 脚本把题目描述和 C 答案拆开。import re # 假设资源文件是 markdown 格式每道题以 ## 题号. 题目名 开头 with open(leetcode_hot100.md, r, encodingutf-8) as f: content f.read() # 按二级标题切分每道题 problems re.split(r\n## , content) for prob in problems[1:]: # 跳过第一个空段 lines prob.strip().split(\n) title lines[0].strip() # 提取 C 代码块 code_match re.search(rcpp\n(.*?), prob, re.DOTALL) if code_match: code code_match.group(1).strip() # 生成复习卡片格式 print(f### {title}) print(fcpp\n{code}\n) print(---)这个脚本的逻辑很直接按##切分每道题然后用正则提取cpp代码块。re.DOTALL让.能匹配换行符否则跨行代码块匹配不到。输出格式可以直接粘贴到 Markdown 编辑器里每道题一张卡片复习时先看题目名回忆解法再展开代码对照。参数方面leetcode_hot100.md是资源文件的路径你需要根据实际文件名改。如果你的资源是 PDF 或 Word 格式先用 pandoc 转成 Markdown 再跑这个脚本。problems[1:]是为了跳过文件开头可能存在的说明文字如果第一道题之前没有其他内容可以改成problems。4. 刷题过程中最容易翻车的几个地方4.1 现象本地编译通过LeetCode 提交报错原因本地 g 默认标准可能比 LeetCode 高或者你用了 LeetCode 不支持的语法。比如#include bits/stdc.h在本地能过但 LeetCode 的 C 环境虽然支持有些企业面试用的在线编辑器不支持。解决把bits/stdc.h换成具体的头文件比如vector、queue、unordered_map。资源里的答案已经尽量用具体头文件了但如果你自己改代码时偷懒用了万能头提交前记得换掉。4.2 现象答案逻辑看起来对但就是超时原因热题 100 里有几道题对时间复杂度卡得很死比如 LeetCode 073 爱吃香蕉的狒狒暴力枚举速度会超时必须用二分查找。资源里的答案已经是最优解但如果你自己写的时候用了 O(n²) 的解法就会卡在最后几个测试用例。解决先看资源答案的注释里写的时间复杂度如果和你写的不一致重点检查循环嵌套和数据结构选择。比如需要频繁查找时用哈希表代替线性扫描需要维护最值时用堆代替排序。4.3 现象边界用例过不了但不知道漏了哪个原因热题 100 里很多题的边界条件很隐蔽。比如 LeetCode 994 腐烂的橘子如果初始状态没有新鲜橘子应该返回 0 而不是 -1如果新鲜橘子永远无法被腐烂返回 -1。这两个边界很容易搞混。解决每道题写完先别急着提交把题目描述里提到的所有“如果”“否则”条件列出来逐个构造测试用例。资源答案的注释里通常会标注关键边界复习时重点看这些地方。4.4 现象同一道题隔一周再写完全没思路原因第一遍刷题时只求“过”没有真正理解解法背后的思维模型。比如动态规划题如果只背了状态转移方程没搞懂为什么这样定义状态换一道类似的题就不会了。解决第二遍刷题时强制自己用自然语言把解法讲一遍讲不清楚就回去看资源里的思路注释。我一般会对着空气讲如果能流畅讲完说明真懂了如果讲到一半卡住就标记下来重点复习。4.5 现象C 答案里的语法看不懂原因资源里有些答案用了 C17 的特性比如结构化绑定、auto推导、lambda 表达式。如果你只学过 C11 或更早的版本这些语法会显得很陌生。解决先补一下 C17 的常用特性。结构化绑定auto [x, y] pair就是把 pair 的两个值拆开等价于x pair.first; y pair.second。lambda 表达式[](int a, int b) { return a b; }就是一个匿名函数[]表示按引用捕获外部变量。这些语法在刷题时很常见花半小时就能掌握。5. 用热题 100 做面试模拟的进阶技巧刷完三遍之后怎么判断自己是真的会了而不是记住了答案我一般会用“白板模拟”来验证。具体做法是随机抽一道热题 100 里的题不看任何资料在纸上或白板上写出完整解法包括头文件、类定义、边界处理。写完之后再对照资源里的 C 答案逐行检查差异。这个过程中最容易暴露的问题不是算法本身而是代码细节。比如queue的pop()不返回值需要先front()再pop()vector的size()返回的是size_t和int比较时会有符号警告unordered_map用[]访问不存在的键会默认插入用find()更安全。这些细节在面试时写错面试官一眼就能看出来。另一个技巧是“限时模拟”。给自己 30 分钟从读题到写完代码中间不查任何资料。热题 100 里大部分题的标准解法都能在 20 分钟内写完如果超时说明这道题的套路你还没形成肌肉记忆。我一般会把超时的题单独记在一个列表里第二天早上先默写一遍再开始新题。还有一个容易被忽略的点是“多解对比”。资源里的答案通常只给了一种解法但热题 100 里很多题有不止一种思路。比如 LeetCode 994 腐烂的橘子除了多源 BFS还可以用 DFS 加时间戳的方式做但代码会复杂很多。你可以试着用不同方法实现同一道题对比时间复杂度和代码可读性。面试时如果面试官追问“还有别的解法吗”你就能从容应对。最后说一个我自己的习惯每次面试前一周我会把热题 100 里标记了星号的题重新过一遍每道题只写核心逻辑不写完整代码。写完之后对着资源里的答案看一遍确认思路没跑偏。这个习惯帮我省了很多时间也避免在面试时因为紧张而卡壳。从那以后我每次准备面试都强制走一遍这个流程希望帮到你。本文还有配套的精品资源点击获取