新闻详情

新闻详情

首页 / 资讯中心 / 详情

LeetCode 500题复盘:从零散刷题到算法知识体系

发布时间:2026/9/28 14:11:30来源:尧图网络
LeetCode 500题复盘:从零散刷题到算法知识体系
刷到第500道LeetCode的时候我发现个人状态产生了一个非常微妙的变化看到新题第一反应不再是焦虑“这题怎么做”而是会下意识地给它归类——这题在考栈还是队列二分答案还是图遍历这种自动分类的直觉就是500道题沉淀下来最值钱的东西。这篇总结不是题号清单而是把过去500道题按知识点重新拆了一遍把高频考点、易错边界、考场上的判断技巧全部放进来适合题量卡在100到300之间、想系统复盘的人参考。无论你是刚开始接触还是工作多年想捡起算法这篇复盘都能让你少走不少弯路。1. 500题是个分水岭先想清楚怎么刷1.1 我不是在刷题是在搭知识骨架很多人的LeetCode刷题方式是按题号顺序往下硬刷今天做链表明天做树后天又跳到动态规划。我前期也这样刷到一百多题就发现问题了题做了一堆但遇到新题还是两眼一抹黑因为每次解决的问题都是孤立的没有连成体系。后来我换了个思路把LeetCode看成是一张知识图谱而不是一道题的名单。数组、链表、栈、队列、哈希表、树、图、二分、双指针、滑动窗口、动态规划、贪心这些都是图谱上的节点。所谓刷到500题本质上不是在积累题量而是把这张图谱的边全连起来了。这个阶段我给自己定了一个原则每做完一道题必须能说清楚它属于哪个知识模块用了什么核心思想以及除了题解之外还有没有别的解法。如果说不清楚就算AC了那这道题也是白做。事实证明这个原则帮了我很大忙因为面试时考官换一点条件、改一点限制我还能认得出题目背后的模式这才是刷题的核心目的。1.2 按时间线还是按知识点我选后者很多人纠结要不要按网上流传的“LeetCode刷题路线图”来我的建议是可以参考但绝不能照搬。路线图是按顺序给你列好题号看起来省心实际上你只是跟着题号走缺乏自己建知识体系的环节。我采用的是“按知识点成块刷”的方式。具体做法是把题目按知识点切片比如花两周时间把所有经典的栈问题过一遍再花一周做滑动窗口用一到两周专攻动态规划。每个板块内部我会按难度递增来刷先容易题建立基本动作再中等题研究变形最后挑战困难题看边界和扩展。每个知识点刷完后我会立刻进入“混合练习”阶段就是从热门100题里随机抽题做。这样做的目的是防止“惯性套模板”的毛病因为在只刷单一知识点时你天然知道用什么方法而混合练习才能模拟真实面试和笔试的场景逼着你去判断。这里特别推荐LeetCode热门100题虽然它只是一个精选集合但几乎覆盖了所有核心知识点的典型考法用来做模块后的验收非常合适。1.3 这类复盘适合谁看这篇总结不是给零基础、连数组都没搞明白的人看的基础教程更适合两类人一是已经刷了三五百题、感觉遇到瓶颈、想回看知识点梳理思路的中级选手二是马上要面试、想在短时间内把高频考点串起来的人。零基础的朋友也可以看但我的建议是先花一两周把常用数据结构的基本操作搞清楚至少知道栈是什么、队列是什么、树要怎么写递归然后再回来看这篇文章里的模式和踩坑收获会大得多。500题的知识点总结核心价值在于把零散的细节串成线然后把线织成网。如果你正处于“刷过不少但没形成体系”的状态这篇文章就是为你写的。2. 核心知识点拆解与实操要点2.1 数据结构栈、队列、哈希表的“实战口诀”LeetCode的题目无论包装成什么场景最后落实的数据结构就是那几类。我刷完500题之后形成了一套口诀式的判断方法。看到“嵌套”“括号”“依赖前面最近一个未匹配元素”这类词第一反应是栈。典型的例子是“基本计算器”它的核心难点不在于四则运算而在于括号会让计算顺序被暂时挂起。这时候需要两个栈或一个栈加一个符号位遇到数字就累加遇到左括号就把当前结果压栈、重置当前状态遇到右括号就弹栈恢复。如果你能把这个流程拆成“进栈-出栈-恢复上下文”基本计算器就只是流程的机械重复。看到“最近”“出现次数”“去重”这些词要优先想到哈希表。哈希表最有意思的点是空间换时间能把O(n)的查找直接降到O(1)。但这几年题目越来越喜欢考察哈希表的衍生用法比如计数器配合排序、哈希表配合双向链表实现LRU缓存。这类题如果没建立起“哈希表可以存索引、存计数、存映射”的思维就很容易只想到用数组硬解。队列则多出现在“按层级处理”的场景里尤其是BFS类题目。看到“最短”“最少步数”“一层一层向外扩散”这些语义大概率就是队列BFS。总之数据结构不是死背定义而是建立“关键词到结构”的条件反射这是500道题里最常被验证的经验。2.2 算法模式双指针、滑动窗口、二分的分界线算法模式比数据结构更上层一点这类题的特征是数据结构和题目意图都能猜中但解法不是一步到位而是需要把暴力解优化到一个巧妙的形态。双指针是我认为性价比最高的技巧。它最大的作用是把O(n²)的双重循环降成O(n)。我总结下来双指针主要两种一种是左右对撞“一左一右向中间走”常用于排序数组上的求和、找两数之和另一种是快慢指针分割链表、找中间节点、判断环都靠它。讲个实操细节用快慢指针找环的时候快指针每次走两步慢指针每次走一步两者一定会在环内相遇这个结论别看简单考场上现场推导很费时间不如直接背下来当工具用。滑动窗口本质上也是双指针的一种变体但它更强调“窗口”的概念一般配合哈希表统计窗口内的状态。遇到“最长连续子串”“子数组满足某条件”这类求连续区间的问题可以先问自己暴力解是不是每次都要扫描一遍子区间如果是那就值得用滑动窗口。维护窗口时最担心的就是左边界移动时忘记更新状态我在这里栽过好几次跟头后面才养成习惯左指针动一下窗口统计状态同步更新一下千万别把两步拆开想。二分查找则是另外一种维度上的模式。一般人的直觉是“二分只能用在有序数组里”但刷过500题之后你会发现真正的二分高手是在一个“符合单调性质的答案空间”里做二分。爱吃香蕉的狒狒这一题就是活生生的例子后面我会单独拆它。分界线在于普通二分考“找某个数”进阶二分考“找最优解”但前提是一样的——必须具备单调性这是能套二分的根本原因。2.3 图论与BFS/DFS腐烂的橘子这类题怎么一眼识别图论题目在LeetCode上的包装千变万化但从“腐烂的橘子”这道题可以提炼出非常典型的识别特征给你一个矩阵或网格要求求“传染全程需要的时间”“最短路径”“连通区域数量”——这些描述基本就是在教你用图遍历。LeetCode 994腐烂的橘子是我推荐反复做的一道入门图论题。它在二维网格里定义腐烂的橘子每分钟向四周新鲜橘子扩散一格求全部变腐烂的最短时间。看到“每分钟”“四周扩散”这几个词我用BFS几乎是直觉反应因为BFS天然就是按层来走的每一层出来正好对应经过了一分钟。这并不是什么高深技巧只是如果你写多了BFS就会形成“网格扩散→BFS”的条件反射。实操时有一个关键点BFS的队列初始化。很多人习惯先把所有起点入队然后才开始遍历。腐烂橘子这题就必须这样做因为起始状态下可能同时有多个腐烂的橘子它们在同一分钟内一起向外扩散。如果只拿一个起点入队算法就会把某些区域传染过程延迟导致答案错误。初始多源入队这个细节也适合推广到所有多源BFS场景比如地图上多个起点的最短距离问题。DFS则和BFS相反适合处理“连通分量”“路径回溯”“岛屿数量”这类题目。它的实现更依赖递归所以风险点在于爆栈和无限递归尤其是网格题里一定要加visited数组或者直接把访问过的格子改成特殊值不然很容易死循环。DFS和BFS怎么选经验是只要题目要求“最少步数”优先BFS只要题目问“有多少个区域/路径”DFS往往更直观但要注意递归深度。3. 高频题型走一遍从题意到代码3.1 二分查找类爱吃香蕉的狒狒这类“最小化最大值”怎么做LeetCode的073爱吃香蕉的狒狒题面套了一个猴子和香蕉的比喻本质上是一个经典的二分答案问题。题目给了香蕉堆数量数组piles和总时间限制h要求你求出一个最小的吃速k让狒狒能在h小时内吃完所有香蕉。这类题一眼看上去不像是二分的对象因为数组本身没有排序。但我们要二分的不是piles数组而是速度k的范围。速度k的最小值是1最大值可以取piles中的最大值再快也没有意义因为每堆香蕉最多只能用一个小时。在这个范围内k越大吃完所需时间越小这是严格单调的所以可以二分。我用Python写的话判断函数一般是这样的逻辑对每个pile吃完这堆需要的时间是ceil(pile / k)把所有堆的时间加起来如果总时间小于等于h说明这个k可行我们可以尝试更小的k否则说明速度太慢需要调大k。def minEatingSpeed(piles, h): def can_finish(k): total 0 for p in piles: total (p k - 1) // k return total h left, right 1, max(piles) while left right: mid (left right) // 2 if can_finish(mid): right mid else: left mid 1 return left这里最值得注意的点是“(p k - 1) // k”这个写法它用来向上取整能避免引入浮点数带来的精度问题。我第一次写的时候用math.ceil(p / k)本地没错但遇到超大数字时浮点数转换会出问题后来才换成了这个整数写法。另外二分模板里我习惯把判断条件写成“当该mid可行时收缩右边界”这样最终出来的left就是满足条件的最小值这个模板顺手且不容易写错。3.2 栈与表达式基本计算器这类题怎么拆基本计算器这道题我一直觉得是检验栈掌握程度的试金石。它要求解析一个包含加减、括号和空格的字符串表达式不允许用eval。刷多了你会发现这类题的核心思路不是把整个表达式一次算完而是维护一个“当前状态”遇到括号时把当前状态保存起来等括号结束时再恢复。我的做法是先初始化两个变量一个存当前数字一个存当前符号。遍历字符串时如果遇到数字就不断累积形成完整数值遇到符号就先把前面的数值算子结果存起来再更新符号遇到左括号就把当前已经算出来的结果和符号入栈然后重置当前状态开始计算括号内的表达式遇到右括号就把栈里的状态弹出来和括号内算出的结果合并。这个逻辑听起来有点绕但落地到代码里也就几十行。实操里的陷阱在空格处理空格直接跳过不影响整个流程还有数字可能是多位比如“12345”要正确切分不能只读一个字符就完事。2024年周赛和热门100题里经常出现这种栈加表达式组合的变体正因为它是很多编译器原理的简化版所以面试官特别喜欢。3.3 动态规划背包、区间DP的状态设计套路动态规划是LeetCode里最让人头疼的部分很多人觉得DP靠天赋。可刷了500题之后我觉得DP更像是一门“翻译”手艺把题目描述翻译成一个状态定义然后找状态转移方程。状态定义如果错了后面全白搭。我常用的套路是从“最后一步”往回推。比如背包问题最后一步显然是在容量有限的前提下决定最后一个物品放进或不放进背包。把这个决策写成转移方程就是经典的0-1背包公式dp[i][j] max(dp[i-1][j], dp[i-1][j-w[i]] v[i])。先能写出二维版本再考虑用滚动数组优化空间这种“先对再优”的思路能显著减少思维负担。区间DP也不难理解它处理的通常是“在某个区间内做合并或切割”的问题。比如石子合并、回文子串分割这类题的状态往往定义为dp[i][j]表示从i到j这个区间的最优结果然后枚举一个分界点k把问题拆成左右两个小区间。如果看到题目里存在“两边向内收缩”“不断合并相邻元素”之类的描述就可以往区间DP上想。写DP还有一个核心习惯先写暴力递归版本加上备忘录优化最后再改迭代。这个递进过程能让你把状态转移想透彻也方便调试。很多人一上来就i、j、k三个循环齐上出了问题根本不知道哪一步的状态定义错了。4. 我踩过的坑和排查方法4.1 死循环和边界条件排查清单500道题刷下来我最常犯的错不是算法思路出错而是边界条件把整个程序搞崩。积累到现在我整理出一份自己的排查清单。第一是二分类问题的退出条件。写while left right还是while left right直接关系到最终能不能退出以及答案落在哪一侧。我的习惯是找“满足条件的左边界”用left right搭配收缩右边界找“确定目标值”用left right。无论如何都要在白纸上手动跑一遍两个元素的数组确保mid不会死循环。第二是数组索引越界。网格类题目最容易出现越界问题访问上下左右邻居的时候必须检查坐标是否在合法范围。我早期直接在原数组上改状态时因为忘记边界检查经常出现IndexError后来养成了写is_valid这个辅助函数的习惯代码一下子清晰了很多。第三是空输入。LeetCode很多题目测试用例会带空数组、空字符串如果你的代码没有在开头判断直接访问下标就会崩。看起来是小事但面试时这类低级错误很影响印象。第四是整数溢出。Python虽然不用担心但如果你用C或Java数组长度、中间乘积、累加和都可能越界。比如二分里求mid写成(left right) / 2两个很大的int相加就可能溢出换成left (right - left) / 2一劳永逸。4.2 周赛430暴露的问题读题与复杂度估算把周赛430拿出来说是因为它非常典型地暴露了我刷题过程里的两个弱点读题不仔细和复杂度估算不到位。周赛的题目比普通题更讲究“脚手架”有些题看起来像是图论实际上考的是贪心有些题看着数据范围能暴力实际上背后还藏着一个隐藏约束。我的血泪教训是读题时先看输入规模而不是急着想算法。输入规模n的范围直接决定你只能用哪些复杂度比如n小到20暴力回溯都行n到10的5次方大概率是O(n log n)或O(n)如果n到10的9次方基本要靠二分答案或是数学公式。我看现在很多新人拿到题就开始写循环写了一百行才发现复杂度超了这在比赛中非常致命。现在我读题都会先圈出三个东西输入数据的取值范围、输出结果的形式、特殊的边界条件。完成这三步再判断这道题属于哪个知识模块。周赛之所以难是因为它经常打破“关键词→算法”的直觉对应关系所以你必须先缩小范围再动手。4.3 调试技巧与时间优化写算法题离不开调试。我常用的第一个手段是构造最小化测试用例把问题规模压缩到底比如链表只放一两个节点网格只给2乘2。这样你可以手动推演整个流程定位到错误发生在哪一步。直接在大数据上调像是大海捞针效率很低。第二个手段是打印中间状态。尤其是动态规划和BFS你在关键步骤print几个变量立刻就能看出状态更新是否符合预期。这个习惯看着笨但比反复读代码要快得多。等确认逻辑无误之后再去掉打印代码。第三个手段是从暴力解开始。如果你能写出一个复杂度高但肯定正确的版本那就先跑它生成正确结果再拿优化版本对照测试。我在做滑动窗口和双指针优化时就经常这样干暴力解和优化解结果一致后确认正确答案才有信心。时间优化方面我的经验是不要过早开始“炫技”。先保证AC再看有没有空间优化空间。很多标准解法的优化版只差一行注释的距离比如自顶向下改成自底向上递归改成迭代往往能让运行时间从超时变成正常。5. 冲刺与复盘500题之后的安排5.1 如何用热门100题做二次复习500题刷完最大的敌人是遗忘。隔上一个月再回头看某个知识点常常会觉得自己像是第一次见到。我的应对方式是用热门100题做二次复习因为它们覆盖面足够全又是从大量题目里筛出来的精华代表。二刷的时候我不会再像第一遍那样从头看题解而是要求自己先想一想这道题的知识点归属、核心解法、易错点分别是什么。如果没有思路再看题目讨论区里的高手代码。这个过程更像在做索引把之前的解题能力“唤醒”。如果某道题已经能秒写出核心代码就直接跳过不浪费时间。我还习惯把热门100题按标签过滤出来比如“链表”“字符串”“动态规划”各抽几题混合做。这样既更新了单一知识点的熟练度又能抵抗“看题型就知道解法”的错觉。这比机械地二刷全部题目效率要高得多。5.2 手写模板与错题本我见过很多人刷题时收藏一堆题解最后一点用不上因为那只是别人思路的拷贝。我自己真正受益的做法是手写模板。所谓“模板”不是一个完整的代码块而是我对某类题的标准流程总结。比如二分答案类我会自己写一个带注释的固定框架比如回溯法我会记录下状态变量要如何定义、如何在递归入口加结束条件、如何在返回前撤销状态。手写一遍远比复制粘贴印象深刻。错题本则用来记录那些“我为什么没想到”的题。不是记录题解步骤而是记录我当时卡住了哪里是在边界没处理好还是对单调性不敏感抑或把题目类型判断错了。这样的错题本价值很高因为它在帮你审视思维漏洞而不是让你重复抄答案。从500道题里总结出来的核心经验其实只有一条刷题不是拼谁题量更多而是拼谁更早建立知识骨架并在骨架上不断补充细节。每次AC之后多追问一句“这题考察什么有没有别的方法”你的收获会比单纯刷五道新题更大。最后再分享一个小技巧如果你准备面试从热门100题里挑出五道不同知识点的题每周模拟一次“限时三题”的练习坚持一个月你做题的稳定度会有非常明显的变化。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

深度学习虚假新闻检测实战:基于LSTM的文本分类模型构建与调参 2026/9/28 15:11:10

深度学习虚假新闻检测实战:基于LSTM的文本分类模型构建与调参

简介:面向计算机相关专业学生的深度学习毕业设计源码,聚焦虚假新闻检测技术研究,适合用于课程设计、论文实验或项目实践。项目以Python为后端核心,同时配有前端展示界面,整体涵盖文本数据清洗、特征构建、循环神经网络…

阅读更多 →
YOLO垃圾检测数据集实战:VOC/COCO/YOLO标签转换与训练 2026/9/28 15:11:10

YOLO垃圾检测数据集实战:VOC/COCO/YOLO标签转换与训练

简介:YOLO垃圾目标检测数据集面向目标检测入门与环保场景落地,收录1000张真实场景的高质量图片,使用LabelImg标注,标注框质量可靠。压缩包总文件数为2000个,其中包含VOC(xml)、COCO(json)、YOLO(txt)三种格式标签&…

阅读更多 →
两数相加与进位制:从竖式加法到位运算的完整拆解 2026/9/28 15:11:10

两数相加与进位制:从竖式加法到位运算的完整拆解

如果我说,一道“两数相加”的题,值得单独写一整篇来拆解,你可能觉得我在小题大做。但“28.两数相加,进位制”这个标题里真正值钱的,其实是“进位制”三个字——它才是这道简单题背后真正的题眼。工作这些年,我见过太多…

阅读更多 →
Kali Linux开启SSH并允许Xshell root密码登录的完整配置指南 2026/9/28 15:11:10

Kali Linux开启SSH并允许Xshell root密码登录的完整配置指南

刚装好Kali Linux的人,十有八九会想着从Windows上用Xshell连过去敲命令。但在Xshell里填好IP,输入root密码,回车,等待你的却常常是“Connection refused”或者“Password authentication failed”。这个场景我太熟了,因…

阅读更多 →
Java字面量详解:类型、常量池与高频面试坑位 2026/9/28 15:11:10

Java字面量详解:类型、常量池与高频面试坑位

Java里有个概念特别有意思:人人都在用、天天都离不开,但冷不丁问一句“字面量(Literal)是什么意思”,很多写过一两年代码的人都能当场愣住。我这些年带人和面试,问“String s "abc";这行代码里哪…

阅读更多 →
大模型首个Token为何总像“垃圾”?从注意力机制到KV Cache的数值真相 2026/9/28 15:10:57

大模型首个Token为何总像“垃圾”?从注意力机制到KV Cache的数值真相

1. 先搞清楚:这里说的“首个Token”到底是哪个Token聊大模型底层机制的时候,网上最常争论的一句话是“第一个token就是垃圾”。很多人的第一反应是:模型不是已经很聪明了吗?为什么生成出来的第一句话、第一个词常常又空又水&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉