资讯动态

LeetCode刷题第10天:从识别套路到构建算法节奏感的关键期

发布时间:2026/10/19 9:36:42 来源:尧图企业网站定制
从盲目刷题到形成节奏感大概每个认真打卡过 LeetCode 的人都经历过这样的转变。我自己的第十天就是一个很有意思的节点既不像前几天那样靠新鲜感硬撑也还没到真正得心应手的阶段而是恰好处于“开始看懂题目套路”和“意识到自己基础薄弱”之间的尴尬地带。如果你正在坚持每天刷题或者正准备开始这篇文章想和你聊聊第 10 天到底在练什么、怎么练才不白费以及我踩过的那些完全可以避开的坑。1. 第 10 天的真实位置练的不是题目是识别题目的能力1.1 为什么前 10 天最容易放弃很多刷题计划撑不过十天不是因为题目太难而是因为前期目标定得太高、反馈来得太慢。第 1 天你可能会兴致勃勃刷三题第 3 天遇到二叉树递归开始卡壳第 5 天感觉自己啥也没记住第 7 天开始怀疑“算法岗是不是不适合我”。这种情绪波动非常正常因为前两周本来就是学习曲线最陡、收益最不明显的阶段它考的不是智商而是你能不能把“刷题”从一个动作变成一套节奏。我自己的建议是前 10 天不要把目标定为“刷够多少题”而应该定为“建立三种感觉”。第一种是熟悉常见数据结构的操作方式第二种是识别题目背后考点的感觉第三种是接受自己“看完题解需要复盘两遍”的耐心。这三种感觉一旦建立起来后续刷题效率会明显比每天硬啃难题高很多。1.2 第 10 天应该具备的能力基线按照比较合理的进度十天后你应该能做到这样几件事看到一道题能大致判断它属于数组、字符串、链表、栈队列、二叉树、哈希表、双指针、前缀和、简单动态规划里的哪一类遇到不熟的题目至少知道应该去哪里找思路能在三十分钟内独立做出一道普通中等题如果超过四十分钟还毫无头绪就主动看题解并复盘。这个标准其实不算低但它比“每天必须 AC 三题”要现实得多。因为刷题第 10 天真正想区分开的不是天赋异禀和普通人而是“有没有形成自己的做题框架”和“永远在零散记忆题型模板”这两类人。我见过不少同学刷到 50 题时开始出现一个明显分水岭一部分人开始觉得“很多题其实是一种思路的变体”另一部分人还是在靠题感硬碰。差别就是从第十天前后累积起来的。1.3 一个好用的节奏模板我这里分享一个我实际用了一段时间的模板它不见得适用于每个人但至少能帮你脱离“今天不知道做啥题”的状态。晚上安排一个固定的时间段先复习昨天的错题再做一道新题最后留十五分钟整理笔记。一周下来你会形成一个周期读题、尝试、卡住、看题解、理解、复现代码、隔天重做。到了第 10 天你会明显发现自己看题的方式从“凭感觉”变成了“看约束条件”。时间上我比较推荐晚饭后固定的时间段比早上刷更有效。因为刷题需要一个相对安静且能持续专注的场景早上的零碎时间适合背一些常用模板晚上的整块时间更适合做完整推理和代码实现。如果你已经工作了中午休息时间也别浪费可以拿来看一道题的分析思路不用写代码只求理解。2. 第 10 天从哪几类题里选料最容易被低估的高频考点2.1 动态规划和滑动窗口为什么值得提前碰很多新手刷题会本能避开动态规划和滑动窗口觉得它们难、技巧性强、容易打击信心。但从实际面试和竞赛的角度看这两个类型往往是中等题里出镜率很高的套路越早建立认知反而越有优势。第 10 天不需要你快速写出转移方程但至少要能看懂一个简单的动态规划题的标准写法。我举个例子经典的爬楼梯问题问你到第 n 级台阶有几种走法每次可以走一级或者两级。很多第一次接触的人会愣住但如果告诉你这就是从斐波那契数列延伸来的你会立刻觉得原来这么简单。所谓动态规划核心就是找状态、找转移、找边界条件。在这个例子里状态是 dp[i] 表示到第 i 级台阶有多少种方法转移是 dp[i] dp[i-1] dp[i-2]边界是 dp[1]1、dp[2]2。代码写出来也就五六行这才是入门级的动态规划应该有的样子。2.2 滑动窗口的精神内核不是“数数”而是“维护”滑动窗口它本质上是一种优化的双指针思路核心在于维护一个窗口让它始终满足题目要求的条件并在这个过程中统计答案。比如说“找出字符串中不含重复字符的最长子串”暴力解法是枚举所有子串然后判断是否有重复字符复杂度能到 O(n^2)字符串一长就非常痛苦。用滑动窗口的话我们会用两个指针 left 和 right 维护一个窗口再用一个哈希表记录窗口里每个字符出现的位置一旦发现重复字符就移动 left 指针跳过。这样每个字符最多进出窗口一次整体时间复杂度降到 O(n)。第十天你完全可以开始接触这种思路因为它的代码量很小逻辑也不复杂真正考验人的是你能不能识别出“这是一道滑动窗口的题”。一旦你认清这点后面遇到类似的问题基本上就是换壳子。这也是为什么我不建议刷题只按数据结构的顺序推进而应该穿插着接触这些算法范式。2.3 双指针与链表会写不难难得是防错双指针也是前期很值得练的板块尤其是和链表相关的题目。链表的题目往往代码不长但是容易在边界条件上翻车比如空链表、只有一个节点、删除头节点等特殊场景。我自己在第十天前后做过一道“反转链表”的题看着很简单递归版几行代码就结束了迭代版稍微长一点。真正让我记住的不是解法本身而是递归调用返回后指针怎么指、边界条件怎么处理这些细节如果不去手推一遍很容易看完题解觉得自己懂了合上书自己写却写不出来。链表题目的价值就在这它逼着你去画图、去模拟每一步的指针指向这种基本功在做后面的复杂题时非常有用。如果你发现自己写链表题老是空指针异常不用沮丧这其实是个好信号说明你已经意识到“代码里的每一个变量都不能想当然”这个道理了。2.4 哈希表与前缀和空间换时间的思路启蒙前十天最容易建立成就感的数据结构是哈希表因为很多“需要快速查找”的问题都能靠它优化。比如两数之和这道经典题暴力做法是双重循环复杂度 O(n^2)用哈希表记录已经遍历过的数字和它的下标之后每遍历一个新数字只需在哈希表里查找“目标和减去当前数字”是否存在复杂度直接降到 O(n)。这是“用空间换时间”最有代表性的例子之一也是很多人第一次感受到算法优化魅力的地方。前缀和这个技巧我个人建议在第 10 天的时候至少要理解概念不急着大量刷题。因为很多前缀和的题目会和哈希表、二分查找结合新手容易一头雾水。但如果你先理解了“前缀和数组 pre[i] 表示从第一个元素到第 i 个元素的和”那“任意区间的和等于 pre[right] - pre[left-1]”这个公式随便就能推出来后面遇到统计连续子数组个数的题目就有了基础。3. 实操过程复盘我第 10 天做的一道典型题及完整思路3.1 题目选择与输入场景我第 10 天晚上刷的是一道中等难度的数组题具体描述是给定一个整数数组 nums 和一个整数 target要求你返回所有和为 target 的连续非空子数组的个数。题目的约束条件是数组长度最大可能到 10^5元素的范围包括正数和负数。这意味着你不能用枚举所有子数组的暴力方法因为数量级是 O(n^2)在 10^5 的量级下根本不现实。为什么要挑这道题来复盘因为它正好综合了两种第 10 天应该接触的核心思路前缀和与哈希表。而且它有个很隐蔽的坑点就是元素里有负数这会让“滑动窗口”的经典解法直接失效。很多人一看到“连续子数组的和等于 target”就条件反射地想去用滑动窗口在全是正数的场景下确实可行但元素有负数时窗口收缩的判断条件就不成立了这绝对是前期刷题时会真实踩到的坑。3.2 思路推导过程当时我看完题目后没有直接写代码而是先做了一次比较规范的思路推导。核心公式就是如果一个子数组 nums[j..i] 的和等于 target那么 pre[i] - pre[j-1] 一定要等于 target。稍微变一下形就是 pre[j-1] pre[i] - target。这意味着我可以一边遍历数组一边维护当前的前缀和 pre同时用一个哈希表记录已经出现过的所有前缀和的值以及它们出现的次数。每到一个位置 i我只要查一下哈希表里有多少次出现了 pre - target这个数量就是以当前位置结尾的、满足条件的子数组个数。然后把 pre 本身也加进哈希表里继续看下一个位置。这个过程里有个细节要非常注意不是把 pre[i] 全部算出来再统计而是一边遍历一边统计。为什么要这样因为统计的是以当前位置结尾的子数组前缀和 pre[j-1] 必须是在 i 之前的某个位置产生不能把自己和自己的前缀和拿来配对否则会出现一个长度为 0 的子数组被错误计入的情况。我一开始没多想直接先构建前缀和数组再用哈希表统计就多算了好几个空子数组排查半天才反应过来。3.3 代码实现与关键注释from collections import defaultdict def subarraySum(nums, target): # 哈希表记录前缀和出现的次数 # 这里初始放入 {0: 1} 是一个非常关键的设计 prefix_count defaultdict(int) prefix_count[0] 1 current_sum 0 result 0 for num in nums: # 更新当前前缀和 current_sum num # 如果之前出现过 current_sum - target 这个前缀和 # 说明从那个位置之后到当前位置的子数组和为 target result prefix_count[current_sum - target] # 将当前前缀和加入哈希表供后续统计使用 prefix_count[current_sum] 1 return result这段代码里最重要的就是prefix_count[0] 1这一句。它看起来不起眼但如果你漏掉了那么当current_sum - target正好等于 0 时就会少统计一种合法情况直接导致测试样例不过。我以前在这里栽过跟头所以想专门提醒一下有些边界值不是靠测试用例提示的而是靠推导边界时需要自己意识到的。3.4 从这题里提炼出来的通用做题方法做完这道题之后我没有马上刷下一题而是花了二十分钟做了一组总结。我发现自己从这道题里提炼出了一种“思考连续子数组问题的通用套路”看到连续子数组相关的问题第一反应先去想能用哪种数据结构维护某种累积信息如果数组里元素有负数滑动窗口大概率不适用看到区间和的需求优先考虑前缀和看到“统计出现次数”之类的问题优先考虑哈希表。这种总结能力恰恰就是第 10 天刷题最该积累的东西。你现在觉得每天刷到的东西是零散的但如果你每道题都做一次这样的提炼刷到第 30 天的时候你会发现自己看到新题的思维方式已经完全不同了。4. 调试技巧与常见报错排查实录4.1 程序“答案错误”比“运行超时”更难搞第 10 天刷题阶段最容易遇到的报错就是答案错误也就是 Wrong Answer。这时候千万不要急着抓瞎改代码也别直接翻评论区看别人怎么说。正确的做法是先自己构造几个测试样例看问题出在哪一步。一般来说有三个检查方向一是看自己的算法思路有没有漏洞比如刚才说的负数场景下滑动窗口失效二是看边界条件有没有特殊处理比如数组为空、目标值为 0、所有元素都相同三是看看会不会是多算或者漏算了某些情况拿前缀和的题来说就是空子数组有没有被算进去。运行超时则是另一种情况它往往提示你的算法复杂度不达标而不是代码写错了。超时的时候要算一下你的暴力解法在极限数据规模下的操作次数如果上了亿级那么基本就会超时必须考虑优化。第 10 天接触这些概念可能会觉得有点抽象但一定要养成估算复杂度的习惯。4.2 一些看起来很奇怪的报错信息除了常见的答案错误和超时还有一些新手很容易碰到的情况。比如数组越界尤其在做链表题或矩阵题时很常见比如整型溢出虽然刷题时语言和平台通常会帮你处理但有些语言里整数相乘还是可能溢出还有哈希表操作时的 key 不存在如果你用dict.get()而不是直接索引访问就能避免 KeyError。我在第 10 天前后处理这类报错的方法是先看报错信息提示的是哪一个测试用例再单独用这个用例在本地跑一遍配合输出中间变量的语句一点点定位问题。写完代码之后我会自己手动过一遍几个关键的小例子比如[1,1,1], target2、[1,-1,0], target0这类极端边界确认逻辑没问题再提交。4.3 一个只属于初学者的时间管理问题排查报错本身是刷题的一部分但你也要警惕陷入“死磕”的状态。如果一道题想了四十分钟仍然没有任何头绪那就应该果断看题解了不是认输而是在节省时间把时间花在理解和复盘上更有价值。我这里说的理解不是看完别人代码觉得自己懂了而是把别人的思路合上自己默写出代码并解释每一步是为什么。第 10 天是培养这个习惯的最好时机。4.4 前十天常见问题速查表高频问题可能的原因排查方法Wrong Answer算法思路有漏洞构造边界样例逐段打印中间值Time Limit Exceeded时间复杂度不达标估算暴力解法操作次数考虑优化数据结构空指针异常链表/树节点未判空在访问节点属性前检查节点是否为 nullKeyError哈希表访问不存在的键使用 get 方法或者先判断键是否存在变量名写错复制代码时遗留检查每个变量是否在循环内外都被正确初始化这张表看着简单但你每踩过一个坑就给它加一行自己的备注积累到后面会成为相当有价值的个性化刷题档案。5. 复盘笔记体系让第 10 天成为高效刷题的真正起点5.1 笔记分类与记录逻辑刷到第 10 天你的手机相册、浏览器收藏夹或本地 txt 文件里可能已经存了不少题解截图和代码片段。但如果这些内容只是躺在收藏夹里吃灰那刷题效果会大打折扣。我比较建议从第 10 天开始建立一个简单的复盘笔记体系它不需要多花哨用本地文档就行。每道题记录三样东西考点标签、我自己的错误、这道题值得记住的一个核心技巧。以我第五到十天刷的一批题为例记录类似这样数组-前缀和-哈希表错误点是在有负数的情况下用了滑动窗口核心技巧是下标映射避免二次遍历链表-快慢指针错误点是没有单独处理链表中只有两个节点的情况核心技巧是循环终止条件的判断技巧。这样的笔记在一开始可能会觉得多余尤其是每天刷题已经很累了还要额外花时间写总结。我自己的经验是笔记不需要长每道题两三行就够。关键是“考点标签”和“错误点”这两栏它们会在你后续复习的时候起到检索目录的作用。5.2 穿插复习策略讲到复习就不得不提到一个很常见的问题今天刷的题明天再写一遍还是不会。这不奇怪因为短期记忆的遗忘速度本来就很惊人。我的策略是做“间隔复习”简单来说就是在第 1 天、第 3 天、第 7 天、第 14 天这四个时间点重写一遍当时的错题或经典题。如果每次都能不卡壳地写出来就可以把这个题从复习队列里划掉如果还是卡壳就再写一遍总结。这个方法对第 10 天的你来说可能有点超前因为系统性的复习计划往往要到刷题量累积到三四十题以后才有明显的需求。但你现在就可以养成一个习惯每天做新题之前先花十分钟重写一道昨天的题。这个动作能让你保持对旧知识的温度也减少后面集中复习时的崩溃感。5.3 放弃“量”的执念最后想说的是第 10 天你已经可以开始有意识地控制刷题数量了。每天刷三题但一题都没消化透不如每天认真磨一题值得。我说的“消化透”指的是你能不看任何提示写出来并且能解释清楚每个细节的用途。如果一道题你能做到这个程度它给你带来的提升远远超过草草刷完五道题。从我的观察看那些能坚持到第 30 天、第 50 天的人普遍不是刷题最多的而是复盘最认真的。第 10 天刷多少题根本不重要重要的是你有没有建立“刷题、记录、复盘、重做”的闭环。我自己刷到第十天的时候最大的一个感受就是LeetCode 上的题本质上是把你往“工程师思维”方向训练。它教你的不只是几个算法而是如何在约束条件下找可行解、如何在效率与实现复杂度之间做取舍、如何在面对未知问题时拆解成已知问题。这种思维方式会慢慢渗透到平时的代码设计、组件封装、甚至排查问题的思路里。如果你能看到这层价值每天花在刷题上的时间其实非常值得。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑