☰
力扣日刷26天112题:算法刷题计划与复盘方法论
2026/10/2 3:04:58 网站建设 项目流程

“力扣日刷26112”这句话,我第一眼看到的时候愣了一下——这分明就是我某一轮刷题计划的真实进度条。26天,112题,平均下来每天4.3道,不算夸张,但也不算轻松。那阵子我给自己定的规矩很简单:工作日每天至少3道,周末可视情况加量到5到6道,每周留出一天不碰新题,只做错题回顾和笔记整理。这篇东西不是教你一个月速成算法大佬,而是把这一套“日刷”打法完整摊开:计划怎么定、题怎么选、卡壳怎么处理、做完怎么复盘,以及那些文档里不会写的坑。

1. 日刷计划是怎么定出来的

1.1 先算账:26天112题意味着什么

很多人一上来就立“每天十题”的flag,结果往往坚持不了一周。因为每天十道对大多数没有竞赛基础的人来说,是重体力劳动。我当时把目标拆成任务量来算:如果按“力扣hot 100 + 高频面试题 + 剑指offer题”的组合,前100题大部分是中等偏易的题目,一题从读题到写完复盘,平均要40到50分钟。三题就是2小时到2.5小时,这基本是上班族晚上能挤出来的极限。而4.3题的平均值,意味着不是每天都能轻松达标,某些日子必须靠周末补进度才能维持总量。

为什么定成26天?因为一个周期刚好接近一个月,能覆盖一整个“习惯养成+检验”循环。21天养成习惯,再用一周巩固。至于112这个数字,也不是刻意凑的,是在hot 100基础上补充了12道最高频的面试题之后得出来的真实进度。我建议想复制这套方案的人,先别急着定一个听起来很酷的编号,先算算自己每天能拿出多少时间,再反推每天题量,比盲目定目标可靠得多。

1.2 难度配比与题单来源

我的难度配比是:简单:中等:困难 = 2:5:1。为什么这么配?

  • 全刷简单题,会形成虚假的自信,遇到稍微绕一点的题就懵。
  • 全是中等题,容易在几个薄弱题型上反复栽跟头,而且一天刷下来太累。
  • Hard题的价值在于“开眼界”,每天至多一道,甚至可以不碰。前期基础不稳的时候碰Hard,很容易把一晚上的时间烧没,挫败感还很强。

题单选择上,我以力扣hot 100作为打底,因为它覆盖了最常见的“面试考察面”,从数组、链表、树到DP、回溯、图论都有;再叠加一条“按标签刷”的支线,比如第一周集中数组和字符串,第二周链表和树,第三周动态规划和二分,第四周回溯和图论。这样分类刷,比随机乱序刷更容易形成体系。同类题放在一起做,你能在短时间内在同一套思路上反复训练,规律会自己浮出来。这和练肌肉差不多,一个部位集中刺激,比每天全身各练一下更有效。

1.3 每周留复盘日

很多人忽略复盘,觉得刷了就完事,结果回头一问全忘了。

我个人每个周期的第7天不刷新题,或者最多只刷1道,时间都用来做三件事:

  1. 把本周错题重做一遍,挡住答案,手写代码。
  2. 把笔记里标红的易错点看一遍,重点看当时卡住的原因。
  3. 把同类题放在一起对比,比如这周做了三道“子数组”相关的题,就横向比较它们的解法差异。

26天下来,这类复盘日帮我巩固了好几个容易混淆的知识点,比如回溯的剪枝和DP的状态压缩,到底在什么场景下用。复盘日最大的价值不是“学新”,而是“把会但容易忘的东西焊死”。

2. 刷题方法论:四步循环

2.1 先独立思考,再决定看题解

我把每道题的完成过程拆成四步循环:读题建模、独立编码、卡壳超时再看题解、合上题解重写。

具体的时间线是这样的:简单题15分钟内没思路就标记,中等题20到30分钟,Hard可以放到40分钟。为什么要卡这个时间?因为面试现场不会给你无限时间,而且卡太久会消耗当天刷题的积极性。日刷是长跑,不是一天决胜负,没必要在一道题上死磕到底。

看题解的正确姿势很关键。我见过太多人把题解从头看到尾,然后照着敲一遍,AC了就觉得自己会了,其实那是“抄了一遍”。正确做法是先看题解里的思路描述和复杂度分析,不看代码;看完后合上题解,凭自己的理解把代码写出来;写完再对照题解代码,检查边界条件、变量命名、循环结构。这里的区别在于:看代码是“确认答案”,看思路是“学习套路”。只有后者才能让你在变体题里举一反三。

2.2 三题例题拆解

光讲方法论太虚,我拿自己这个周期里刷过的三道题,完整拆一下当时的思考过程和卡点。

2.2.1 力扣112 路径总和:递归的“缩参数”思路

这道题问的是一棵二叉树里,是否存在一条从根节点到叶子节点的路径,使得路径上所有节点值之和等于目标值。题号刚好落在我进度条的第112题,那天晚上刷到它时,我正好在做树的标签计划。

树这个结构,第一反应就该是递归,因为树的定义本身就是递归的。这题的三个关键点值得单独说:

  • 叶子节点的定义是左右子树都为空,不是“当前节点没有右孩子”就算叶子。
  • 这道题常见错误是:只看当前节点值等于targetSum就返回True,忘了验证它是不是叶子,结果把非叶子节点当成终点。
  • 一个小技巧:不需要额外维护一个sum变量,递归时直接把targetSum减去当前节点值,把问题规模逐层缩小。这样每一层面对的都是“从当前节点到叶子是否还有剩余值要走”。

代码很简洁:

def hasPathSum(root, targetSum): if not root: return False if not root.left and not root.right: return root.val == targetSum return hasPathSum(root.left, targetSum - root.val) or hasPathSum(root.right, targetSum - root.val)

这里有个边界细节:空树返回False,因为不存在路径;空节点本身也不返回True,因为叶子判断是在父节点那一层做的。递归的终止条件,一定要和题目定义的“路径终点是叶子”严格对齐,不然会栽在很简单的边界用例上。复杂度是O(N),每个节点访问一次。

2.2.2 力扣875 爱吃香蕉的珂珂:什么时候该想到二分

这道题给了几个香蕉堆,珂珂每小时吃k根,如果一堆不够k根,她吃完这一堆后这一小时内就不再吃别的,问最小的k使得总耗时不超过H小时。

为什么想到二分答案?因为如果直接枚举k,从1到最大堆尝试,数据范围一大必然超时。但这里有一个强特征:速度越快,耗时越短,这是一个单调关系。凡是“求满足条件的最小值/最大值”的极值问题,且有单调性,就该往二分答案上想。

二分答案的核心不是“找数据”,而是“猜一个答案,然后验证它是否可行”,再不断缩小区间。对于本题:

  • 左边界left = 1,因为速度至少是每小时1根。
  • 右边界right = max(piles),因为速度比最大堆还大时,每个堆也至少需要1小时,再往上提速没有任何意义。
  • check函数里,每个堆的耗时是向上取整,即(p + k - 1) // k,把所有堆的耗时加起来和H比较。

代码:

def minEatingSpeed(piles, h): def feasible(k): return sum((p + k - 1) // k for p in piles) <= h left, right = 1, max(piles) while left < right: mid = (left + right) // 2 if feasible(mid): right = mid else: left = mid + 1 return left

这题我实际写的时候踩过一个坑:一开始向上取整写成了 p // k + 1,结果整除的时候会多算一小时。比如p = 8, k = 2,正确是4小时,p // k + 1算出来却是5。这种细节只有拿具体例子算一遍才能发现,也是二分答案题最容易出错的点。

2.2.3 力扣53 最大子数组和:从穷举到DP

给一个整数数组,找最大连续子数组和。暴力做法是枚举所有开头和结尾,复杂度O(N^2),在数组长度一大的时候基本不行。

这道题的标准解法是动态规划,状态定义非常讲究:dp[i]表示以第i个元素结尾的最大子数组和。转移方程是dp[i] = max(nums[i], dp[i - 1] + nums[i])。含义是:要么从当前元素重新开始一段,要么把当前元素接到前一段的后面。答案就是所有dp[i]里的最大值。

新手容易把状态错误定义成“前i个元素的最大子数组和”,这样转移会乱掉,因为前i个元素的最大子数组可能并不以第i个元素结尾,就没法推导出i+1时的状态。这里“以谁结尾”这个定义是DP能否写对的关键。

因为dp[i]只依赖dp[i - 1],所以可以压缩成单变量滚动更新:

def maxSubArray(nums): cur = best = nums[0] for x in nums[1:]: cur = max(x, cur + x) best = max(best, cur) return best

这道题让我印象最深的一点是:它看起来像“滑动窗口”或“前缀和”相关的问题,但最自然、最稳定的解法其实是DP。这也提醒了我,刷题不能靠题目长相去硬套模板,得从状态和转移的角度去理解。

2.3 做完题后的三种复盘姿势

AC只是第一步,我在这个周期里用了三种复盘方式,把短期记忆变成长期能力:

  • 隔天重做。挡着题解,凭记忆和思路自己写一遍。能独立AC,才算这道题真正归你了。
  • 写结构化的笔记。模板固定为“一行思路、复杂度、易错点、同类题链接”。一行思路用大白话写,比如“路径总和就是用targetSum一路往下减,到叶子时判断是否为0”。
  • 同类题归并。把“二分答案”的题归到一张表里,把“递归做树”的题归到另一张表里。考前只翻表格和错题,效率比重新翻题解高很多。

复盘做得好不好,直接决定你刷100题之后,是变成一个有积累的人,还是变成一本只写过答案的错题本。

3. 一天的日刷实操记录

3.1 时间怎么排

我自己的固定节奏是:早上通勤时用手机读题,确定当天刷哪三道;中午午休做第一道;晚上集中一个半到两小时做剩下两道,外加复盘。这样分配的原因是,读题和“想思路”可以碎片化,但写代码必须要有整块时间。如果晚上才从零开始找题、读题、理解样例,那前半小时基本就浪费了。

如果当天真的忙到爆炸,我有一套降级方案:只做一道简单题,也要完成打卡。因为“日刷”这个计划的核心是维护连续性,一旦断了一天,心理上就容易滑坡,接着就是整个计划的崩盘。一道简单题花不了二十分钟,它起的不是知识作用,是惯性作用。

3.2 一次真实的刷题过程记录

拿刷875“爱吃香蕉的珂珂”那个晚上举例。我第一步先想暴力:枚举k从1到max(piles),每个k都算一遍总耗时,第一个满足条件的k就是答案。看起来没错,但piles数组长度和数值一大就超时。然后我停下来想,这题是不是有单调性?因为速度越快,耗时越短;于是自然过渡到二分答案。这个“暴力→观察单调性→二分”的链条,其实是二分答案题的通用识别路径。

真正写代码时我卡在了向上取整那行。一开始写的是sum(p // k + 1 for p in piles),自己跑测试用例时发现p = 8, k = 2这种情况会算成5小时,但实际是4小时。原因在于整除时不该加1。后来才改成(p + k - 1) // k。这个调试过程看似在改一行代码,实际是在帮助我把“向上取整”和“边界条件”这种细节焊死在脑子里。

3.3 用什么工具辅助记录

我用一张Notion表格,字段包括:日期、题号、题名、标签、难度、是否第一遍AC、思路一句话、易错点、复习日期。每周复盘日按“复习日期”过滤,找出本周待复习的题目。

这套记录方法的优势在于,单靠脑子记忆100多道题的状态几乎不可能。尤其是“我到底哪题当时是AC了的”、“哪题是看了题解才过的”,没有记录全凭印象,错题很容易漏掉。我建议至少用一个简单的Excel,字段可以比我少,但“题号、标签、是否第一遍AC、复习日期”这四项一定要有。它们在复盘的时候,是决定你在哪道题上花时间的重要依据。

4. 常见问题与避坑

4.1 卡题超过30分钟怎么办

我的处理流程:先标记,跳过,当日不恋战。晚上或次日再来看题解。不要硬磕超过40分钟,因为多数题的思路盲区不是靠死磕能突破的,边际收益极低。但也不能一卡就秒查,至少要给自己一个“独立建模”的时间,把题目翻译成自己理解的语言,哪怕翻译是错的,也比完全没思考强。

看题解后如果发现自己卡住的点只是一行边界条件,那说明思路方向是对的,下次只需要更细致;如果发现整个思路都错了,那就要把这个“错误思路”记下来,避免下一次再踩同一个判断。

4.2 刷了就忘是常态,怎么对抗遗忘

你不是记忆力差,是缺少复习。这不是鸡汤,是事实。我用了“三遍法”:第一遍AC后当天整理思路;第二遍隔天重做;第三遍一周后复盘日再重做。通过间隔重复,把短期记忆转成长期记忆。

如果第二天重做时完全没思路,说明前一天是抄答案的,不叫学会。这种题目我会在笔记里标记成“尚未掌握”,单独加一轮复习。遗忘不可怕,可怕的是你以为自己会了,于是从不复习,到面试那天才发现大脑一片空白。

4.3 时间不够怎么保进度

保底策略三条:

  • 当天只做一道简单题,打卡就行。维护连续性优先于题量。
  • 用“读题+写思路”代替完整编码。在笔记里写清楚用什么算法、复杂度多少、边界在哪,也算完成了当天的训练量。
  • 把周末作为补救窗口,工作日欠的题,周末集中补。

这套方案适合时间不稳定的上班族。它的核心是:允许进度波动,但不允许进度清零。

4.4 到底要不要碰Hard题

我的建议:前100题阶段,Hard控制在总题量的10%以内,可以不刷。Hard题的价值在于开阔思路,但基础题型没稳定时,做Hard容易受挫,且耗时不可控。我把Hard题当成“开眼题”,了解标答思路就够了,不要求当场AC。等刷过150题、中等题稳定之后,再拿Hard来检验自己的知识结构是否完整。

这里也整理一个常见问题速查表,方便对照:

症状原因处理办法
看题解秒懂,自己写就卡没有独立重写,变成了照抄合上题解,凭思路自己写一遍
边写边忘记思路建模阶段太草率先写伪代码,再填实现细节
同一类题每次都要重新想同类题归并复习不够增加隔天重做,把同类题放一起对比
AC了但不知道为啥只写了代码,没分析复杂度补复杂度笔记,按模板记录思路
晚上刷题总想玩手机时间安排不合理把最难的任务放最前面,或者睡前断网

4.5 心态崩了怎么调整

日刷计划进行到两周左右,会进入一个疲惫期:前面刷的题开始遗忘,新题又越来越难,很容易产生“我是不是不适合刷题”的自我怀疑。

我的调节经验是,把目标从“必须会做”改成“必须见过”。见得多,就有印象;有印象,第二次遇到就不慌。另外,挑一天专门刷简单题,把打卡的快乐找回来。别小看这种“虚荣性AC”,它对维持长线刷题的心态真的有用。

写到这,我想起完成第112题那天的状态。其实那天很累,晚上十点多才打开编辑器,但按计划还是把“路径总和”写完了。关电脑前我在笔记里写了句:递归的核心,是把大问题剪成同结构的小问题。后来这句话帮我在好几道树题上省了时间。

“日刷26112”这个进度条能跑通,技术上靠的是计划、选法、复盘三件套,但更重要的是一种“每天都碰一下”的惯性。你不需要一开始就很强,只要保证每天都有一个小进度,这个计划就能像滚雪球一样滚起来。想定自己的日刷编号的话,我的建议很简单:从每天3道开始,先坚持两周,再回头看,你会发现“算法高手”这个标签离自己没那么远。

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

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

立即咨询