拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

热题100第三轮怎么刷?以875爱吃香蕉的狒狒拆透二分答案模板

热题100第三轮怎么刷?以875爱吃香蕉的狒狒拆透二分答案模板

刷LeetCode的人应该都有过这种体验:第一轮过完Hot 100,感觉啥都会了,合上电脑再打开,一道题都不认识。真正开始第二轮、第三轮的时候,才发现自己之前就是“背答案”,不是“做题”。尤其是当我开始刷到热题100的中后段,遇到二分答案、动态规划、滑动窗口混在一起出的时候,那种“明明做过的题却还是卡住”的感觉特别真实。

说实话,热题100刷三遍和刷一遍,效果完全是两回事。第一遍是建立知识框架,第二遍是打通套路之间的连接,第三遍才是真正练“在面试高压下快速找到思路”的能力。这篇内容主要围绕热题100第三轮怎么刷、刷什么、怎么把经典母题变成自己的模板来展开。我会拿最近关注度很高的0743这道“爱吃香蕉的狒狒”作为主案例,把二分答案类题目从直觉到代码到变种一次性讲透,顺便聊聊周赛430里暴露出来的问题——很多人在周赛里翻车,不是题不会,而是没有把热题100里的模板真正变成自己的东西。

这轮刷题的核心逻辑只有一个:把“做过”变成“会做”,把“会做”变成“能在五分钟内想起来怎么做”。

1. 第三轮刷热题100的整体思路:从“过一遍”到“形成肌肉记忆”

1.1 三轮刷题各阶段的目标到底是什么

很多人问热题100到底要刷几遍,我的答案是至少三遍,但每一遍的目标完全不同。

第一轮的目标是见世面。你只需要把题过一遍,知道“原来还有这种解法”,不要求全部独立做出来,重点是把数据结构的基础操作和常见算法范式混个脸熟。这一轮最常见的坑是:很多人刷完一遍觉得自己都掌握了,其实只是“看题解的时候都懂了”,离自己写出来还有很大距离。

第二轮的目标是建立题型分类意识。这时候你要开始给题目贴标签:这道题是二分答案、那道题是双指针、另一道是区间DP或者状态压缩。二刷的时候一定要脱离题解独立写代码,写不出来再看答案,看完之后用题目号加解题套路记到自己的题单里。

第三轮的目标才是形成肌肉记忆。所谓肌肉记忆,不是死记硬背代码,而是看到题型的特征词之后,能在几秒钟内判断出该用什么算法方向。比如看到“最大值最小化”“最小值最大化”“在XX天内完成XX任务”这类描述,条件反射就应该是二分答案。到了这个阶段,做题已经不是“会不会”的问题,而是“多久能想出来”的问题。

我实测下来,三轮如果用“15天一轮、每天6到8题”的节奏,一个月内把热题100刷完三遍完全没有问题。关键不是刷得快,而是每一遍都带着明确的目的去刷。

1.2 第三轮的核心动作:乱序、限时、口述思路

第三轮刷题最大的变化,是不要再按标签刷。很多人在LeetCode上刷题有个惯性:这周刷二分,就把所有二分题拉出来刷,这样确实很爽,因为同一个套路连续用十遍,是个人都会。但面试不会给你分类,面试题是各种算法混在一起出现的。

所以第三轮我强烈建议直接用随机顺序模式,或者把题库顺序打乱。热题100的原始顺序其实已经接近乱序了,但如果你刷过一遍,难免会记住“下一道题是链表反转”,这种记忆会干扰真正的思路训练。建议直接挑着号段跳着刷,比如今天刷第30、45、71、88、100题,明天再从第10、52、63、79、92题开始。

限时也很重要。第三轮每道题给自己20到25分钟,超过时间直接看题解,然后用表格记下来为什么没想出来。这个“为什么没想出来”比题目本身更值钱,它直接指向你思维盲区的位置。

我在第三轮特别强调“口述思路”这个动作。做法很简单:看题之后,先不写代码,用语音或者写字把解题思路描述一遍,包括数据结构的选择、遍历的顺序、边界条件的处理。能清楚地说出来,才是真的理解了。如果你发现自己说不明白,或者说着说着漏洞百出,那这道题即使写出来了,也是运气好。

2. 核心题解:LeetCode 875“爱吃香蕉的狒狒”为何是二分答案的教科书

2.1 题目描述和直觉陷阱

说回0743这道题,LeetCode里编号是875,题目名字叫Koko Eating Bananas,中文站一般叫“爱吃香蕉的狒狒”。这道题是热题100里二分答案类型的代表题,也是面试高频中的高频。题目本身很短:有一堆香蕉piles,每堆的数量不同,狒狒每小时最多吃k根,但它只会在一小时内只吃同一堆的香蕉,不会同时吃两堆。现在要求它能在h小时内吃完所有香蕉,求满足条件的最小速度k。

我第一次做这道题的时候,直觉是模拟。就是从速度1开始,算一下吃完所有香蕉需要多少小时,如果超过h就速度加1继续试。这个模拟思路完全正确,但效率惨不忍睹。因为最坏情况的速度可能要试到piles数组的最大值,也就是10的9次方量级,每次模拟又是O(n)的遍历,整体下来O(n*m),m大到一定程度就直接超时了。

这道题的关键恰恰在于看穿“最小速度”是一个在排序空间上的搜索问题。你不需要从1开始一个个试,而是可以用二分查找把“试速度”这个过程从线性降到对数级别。这就是二分答案最核心的思路:不在原数组上二分,而是对答案的取值范围二分。

2.2 为什么二分答案在这里成立

很多新手理解不了“对答案二分”这个概念。我换个更生活化的方式解释:假设你在猜一个谜底,谜底的范围是1到100。最笨的办法是从1开始往上猜,运气不好要猜100次。聪明的办法是先猜50,如果谜底比50大,就猜75,如果比75小,就猜62,这样每次把搜索范围减半,最多猜7次就能锁定答案。

875题就是典型的一个“答案可二分”的问题。注意这里的关键:速度k和总时间f(k)之间是单调的。速度越大,吃完所有香蕉花的时间越短,这个关系在数学上是严格单调的。正因为存在这个单调性,所以二分的判定条件才能成立。

具体的二分范围也很好定:速度的下界是1,因为狒狒每小时至少吃1根;上界是max(piles),因为速度再快也没有意义,每小时最多也就能吃掉一整堆,不可能一根香蕉吃两个小时。确定了上下界之后,每次取中间值mid,判断以这个速度能不能在h小时内完成。如果能完成,说明mid可能还是太快,可以往左半边继续找更小的速度;如果不能完成,说明速度不够,就往右半边找更快的速度。最后收敛到第一个能满足条件的值,就是答案。

这个过程用代码写出来非常短,但每一步的边界处理都有讲究。我先给出可以直接抄的Python实现:

class Solution: def minEatingSpeed(self, piles: List[int], h: int) -> int: # 判定函数:给定速度k,计算需要的小时数 def can_finish(k: int) -> bool: hours = 0 for p in piles: # 每堆香蕉需要的小时数 = ceil(p / k) hours += (p + k - 1) // k # 提前剪枝:如果已经超过h就没必要继续算了 if hours > h: return False return hours <= 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

2.3 边界条件和易错点的深度剖析

这个代码看起来简单,但真正写对的人不多。第一个易错点是向上取整的写法。每堆香蕉p根,速度是k根每小时,吃完这堆需要的时间严格来说是p除以k,但因为是整小时计算,所以要用向上取整。Python里向上取整的经典写法是(p + k - 1) // k,这个公式的原理是:给被除数加上除数减1,再整除,就能把余数折成多出来的一个小时。很多人直接写p // k,这样在p不能被k整除的时候就会少算时间,导致整个判定结果都是错的。

第二个易错点是二分循环的边界写法。我在代码里用的是left < right加“left = mid + 1, right = mid”的模板。这个模板在二分答案题里是默认的安全写法,因为你不可能在mid的判定上回退到已经判断过的区间以外。如果换一种写法,用left <= right,那么left = mid + 1和right = mid - 1,最后返回的left确实是答案,但对新手来说很容易搞混返回的是left还是right。我个人的经验是:判定型二分用“保留可行边界、收缩不可行边界”的思路,也就是left始终指向最后一个不可行的位置或起点,right始终指向第一个可行的位置,最后相遇的位置就是答案。

第三个易错点是时长的提前剪枝。在can_finish函数里,每次累加hours后立刻跟h比较,一旦超了就返回False,这样可以省下大量无意义的计算。这个剪枝在大数据量下效果非常明显,我在本地测过一组极端数据,piles长度是10的四次方,每一个值都是10的九次方量级,h也很大,有剪枝的版本比没有剪枝的快了将近一半。

3. 从875题延伸开去:一类二分答案题的通用模板和题单

3.1 判定函数 + 二分范围:这套模板能解决什么

875题做完之后,我强烈建议你立刻把它升级成模板。二分答案类题目的共同套路其实只有三件事:确定答案的取值范围、设计判定函数、套二分模板。

判定函数是这套模板的灵魂。不同的题目,判定函数的写法完全不同:875是模拟吃香蕉算总时间;1011题“在D天内送达包裹的能力”是模拟船只运送包裹,判断在给定载重量下能不能在D天内送完;410题“分割数组的最大值”是判断在给定子数组和上限下,能不能在m次分割内完成。虽然题目背景完全不同,但核心逻辑都是同一个:给定一个候选值,检查它是否可行。

二分范围的设计也有规律。875的答案是速度,范围从1到数组最大值;1011的答案是船的载重,范围从单个包裹重量的最大值到所有包裹重量之和。为什么下界是单个重量最大值而不是1?因为一个包裹不能拆成两天运,船的载重至少得能装下最重的那个包裹。这个“下界由题目约束条件推导”的思路,是很多人在实战中容易漏掉的,新手常见的错误就是把下界写成1,然后跑出来边界错。

我把热题100和周边高频题里值得用二分答案模板过一遍的题整理成了一个清单:

题号题目二分对象判定函数核心逻辑
875爱吃香蕉的狒狒进食速度按堆向上取整累加总时间,对比h
1011在D天内送达包裹的能力船载重模拟装船过程,统计天数对比D
410分割数组的最大值子数组和上限贪心分割,统计段数对比m
1482制作m束花所需的最少天数等待天数统计连续开放的花朵能否凑够m束
2226每个小孩最多能分到多少糖果每人分配数统计每个堆能切出多少个目标份量

3.2 典型变种:1011和410怎么套同一个模板

这里我把1011和410简单展开讲讲,因为它们最能体现“模板变通”的思路。

1011题是给了一串包裹重量weights和运输天数days,要求找到最小的船载重量。判定函数writing起来就是:初始化当前船上重量cur为0,需要的天数day为1,然后遍历每个包裹,如果cur加上当前包裹重量超过mid,那就day加1,同时把cur重置为当前包裹重量。如果最后day小于等于days,说明这个载重可行。二分范围的下界是max(weights),上界是sum(weights)。这个模板和875几乎一模一样,变的只是判定函数里的累加逻辑。

410题是给一个数组nums和一个整数m,要求把数组切成m个子数组,让这m个子数组各自和的最大值最小。它的判定函数是:给定一个上限mid,贪心地从头开始切分,如果当前子数组和加上下一个元素会超过mid,就切一刀。统计一共切了几段,如果段数小于等于m,说明mid可行,尝试更小的上限。这道题的难点在于把“分割问题”抽象成一个“给定上限是否能满足m段”的判定问题,一旦完成这个转化,后面的代码就是模板。

我把这三道题放在一起刷的最大感受是:数据结构部分其实没有本质差异,差异全在题目语义到判定函数的翻译上。这种翻译能力只能靠积累,所以这三道题一定要独立写,不要看题解,哪怕卡两个小时也要自己先翻译一遍。

4. 周赛430带给我的反思:经典母题和赛场新题的差距在哪里

4.1 周赛翻车的根源往往不是题目难

最近LeetCode周赛430一结束,讨论区里的声音很丰富。我看了看,发现一个有意思的现象:很多人在抱怨T3、T4难,但仔细分析题解之后会发现,难题里用到的核心框架都非常经典,有不少就是热题100里的母题变形。

我自己的感受是,周赛翻车最核心的原因不是题目难,而是“短时间内提取正确模板”的能力不够。热题100刷过和没刷过,差别不在你会不会那道具体题,而在于你能不能在一道新题目里看到旧模板的影子。比如,如果题目里出现“让某个最大值最小”,你脑子里能不能立刻弹出二分答案;如果出现“求满足条件的连续子数组的个数”,你能不能立刻想到前缀和配合哈希表。

周赛430的讨论里,很多高赞题解都在说类似的思路:T2看起来是模拟,本质是差分数组的区间更新;T4看起来是复杂状态的问题,本质是带优化的DP。这些结论听起来轻描淡写,但比赛的时候能在一分钟内看出来,靠的绝对不是临场发挥,而是平时把热题100的经典题练成了条件反射。

4.2 怎么把热题100的母题迁移到周赛新题

我复盘自己周赛的经历,总结出一个特别有用的思维流程:读题后先问四个问题。第一,这个问题的搜索空间是不是有序的?如果是,考虑二分。第二,这个问题是不是存在重叠子问题?如果是,考虑DP,然后思考状态怎么压缩。第三,这个问题的暴力解是不是要用到重复区间的统计?如果是,考虑前缀和、差分、滑动窗口。第四,这个问题是不是和区间合并、单调性有关?如果是,考虑单调栈或双指针。

这个四问法在周赛430的实战中帮我避免了很多无谓的尝试。比如有一道题如果归结为“在有限资源下最大化收益”,那么背包DP方向的概率就非常高;如果归结为“在某个区间内找满足条件的配对数量”,那么双指针加排序的方向就非常清晰。

当然,要支撑这套思维流程,前提是热题100里的经典题真的练熟了,尤其是二分、滑动窗口、单调栈、背包DP、区间DP这五大类。热题100的价值就在于它把这几类问题的高频母题都集齐了,你只需要把这些母题真正吃透,然后把它们当作武器库,周赛遇到新题就是“从武器库里挑选合适的武器”而已。

4.3 我在周赛430后调整的刷题计划

周赛430之后我做了一个动作:把热题100的题目按照“能否在15分钟内说出完整思路”重新过了一遍。过完发现,大概有三分之一左右的题我虽然能写对,但思路描述很模糊,边界条件的记忆是“跟着感觉走”的。这些题目都是我下一轮需要重点重刷的对象。

具体方法是用一个表格记录每道题的状态,我自己的模板是这样:

题号题目第一次刷正确性第三次刷能否口述思路按标签分类错因/薄弱点
875爱吃香蕉的狒狒否是二分答案向上取整写错一次
1011在D天内送达包裹的能力是是二分答案下界推导不熟练
15三数之和是否排序+双指针去重逻辑没记住
53最大子数组和是是动态规划无
200岛屿数量是否DFS/BFS辅助空间思路混乱

这个表格不用做得很漂亮,自己看得懂就行,关键是每天刷完题之后花五分钟更新它。到了第三轮结束的时候,你手里会有一份非常珍贵的“个人弱点地图”,接下来就可以针对性突击,而不是再从头到尾无差别刷一遍了。

5. 第三轮刷题方法升级:一天怎样安排、错题怎么处理

5.1 每天刷几题最科学、时间怎么分配

很多人问我第三轮一天到底刷几题合适。我的建议是工作日4到5题,周末8到10题,整体目标是一轮15到20天刷完。重点是,这4到5题不能是按顺序刷四道,而是不同题型的混合组合。

比如今天刷875三分答案,那另外几道就应该选自其他类别,比如一道双指针(15题三数之和)、一道链表(206题反转链表)、一道滑动窗口(3题无重复字符的最长子串)。这样混着刷的核心目的,就是在每个题目的切换中锻炼“识别题型”的速度。如果连续刷同类题,你根本没有在做识别训练,只是在做重复套模板训练。

每天的时间分配我建议是:先花45分钟到1小时做新题,每道题最多20到25分钟;然后花15分钟复盘错题和卡壳的题;最后花10分钟更新错题表格和第二天的刷题计划。一小时左右的投入,坚持三周,效果非常可观。

5.2 错题记录到底记什么、怎么记

错题记录不是把题解复制一遍,那是无效功。真正有效的记录只包含四块内容:题目编号和题名、我一开始的错误思路、正确思路的核心触发词、以及“下次看到什么特征词应该想到什么解法”。

举个例子,我在875这道题的错题记录里写的是:“错误思路是想滑窗或贪心;正确触发词是‘求最小的速度使总时间不超过h’;下次遇到‘XXX的最小值使得YYY满足条件’,立刻想二分答案。”这个记录和题解完全不同,它记录的是我的思维路径错在了哪里,而不是代码该怎么写。

我见过太多人的笔记记得跟题解文档一样详细,但最后根本没有回看的价值。笔记的唯一目的是提醒你“你曾经在这里摔倒过”,而不是替你保存一份标准答案。

5.3 卡壳超过20分钟到底要不要看题解

这个问题我经历过很多次反复。最开始觉得看题解等于作弊,所以一道题能卡两个小时;后来发现死磕效率太低,又走向另一个极端,卡十分钟就看题解。

现在的原则是:20分钟是临界点。20分钟内如果没有任何思路,或者只有一个模糊的方向但完全不知道下一步怎么走,就直接看题解。但看完题解不算完,要把题解合上,凭记忆和理解重新写一遍,然后隔一天再写一遍。这个“隔天复写”的动作比当天连续写五遍都有效,因为它能检验你是不是真的记住了思路,而不是靠短期记忆复刻代码。

如果20分钟内你有思路但只是实现出错,那就先不急着看题解,把代码调试到正确为止。这两种情况的处理方式完全不同:思路缺失是知识盲区问题,要看题解补盲区;实现错误是熟练度问题,要自己Debug练手感。

6. 实操过程记录:以875为例,从读题到AC的完整复盘

6.1 我自己的第一反应和快速分析过程

我拿875这道题作为第三轮刷题实操记录的例子,完整走一遍我的思考流程。拿到题目之后,我先看数据范围。piles长度最大是10的四次方,每堆香蕉最大10的九次方,h最大也是10的九次方。看到这个范围,第一时间就应该排除纯模拟和暴力枚举,因为这些做法的复杂度至少在O(n*m)量级,m稍微一大就雪崩。

接下来看题目的问题形式:“求最小速度k”。在算法里,“求某个参数的最小值使得条件成立”是一个很强的信号。我脑子里自动关联到二分答案,因为只有具备单调性的搜索空间才适合二分,而这里速度加快必然导致总时间减少,单调性天然成立。

确定了二分答案的方向之后,我再把二分范围定出来:left=1,right=max(piles)。然后写判定函数,把“以速度k能否在h小时内完成”翻译成代码。这个翻译过程是整道题的关键,翻译错了全盘皆输。我写的判定函数是遍历每一堆,计算该堆需要的小时数并累加,超过h就直接剪枝。

6.2 手写代码时的细节处理和踩坑记录

实际写代码的时候,我一开始就踩了一个坑:向上取整写成了p // k加一个条件判断,代码又长又容易错。后来改用(p + k - 1) // k这种一行写法,简洁且不容易出错。这个一行写法的原理前面说过,就是用整数运算模拟ceil,但这里要特别注意整数溢出问题。如果p和k都是10的9次方量级,p+k-1可能会超过32位整数的范围,所以我在代码里用的类型是Python的int,天然不限长,如果是C++就得用long long。

另一个细节是二分循环内部的收敛方向。我始终强调这个模板的记忆方法:先写left < right,判断可行就移动right到mid,判断不可行就移动left到mid加1,最后返回left。这个模板和“两个边界夹出一个最左可行值”的语义完全一致,写多了就有肌肉记忆。

我自己当时测试出的一个极端情况是piles=[1],h=1。这种情况下二分范围是[1,1],循环根本不会进入,直接返回left也就是1,结果是正确的。另外测试piles=[3,6,7,11],h=8,正确答案是4。我手算验证了一下:速度4时,三堆分别需要1、2、2、3小时,总时间8小时刚好满足;速度3时,需要1、2、3、4小时,总共10小时超了。所以答案确实是4,代码跑出来也是4,这时候才算完全放心。

6.3 同类题复写练习:把模板吃进骨子里

875 AC之后,我紧接着写了两道同类题来验证模板。第一道是1011,判定函数从算时间变成模拟运货;第二道是410,判定函数从算时间变成贪心分段。写这两道题的时候,我刻意不参考875的代码,只照着“二分范围+判定函数”的框架自己推,结果都写出来了,而且边界条件一次过。

这三道题写完之后,我总结出一个规律:二分答案题的判定函数虽然是五花八门,但核心都在于把题目条件“翻译”成一个布尔表达式。翻译能力强的,写起来又快又稳;翻译能力弱的,就算知道用二分也写不出来。这个翻译能力没有捷径,只能靠多练多种背景的二分答案题来积累。

我还发现一个小技巧:写判定函数的时候,尽量用“最坏情况提前退出”的思路来优化。875里是累计时间超过h就返回False,1011里是装船天数超过D就返回False,410里是分段数超过m就返回False。这个剪枝在判定值为false的时候能大幅减少计算量,实测大数据量下性能提升非常显著。

7. 第三轮刷题常见问题与排查技巧

7.1 为什么我刷第三遍了,看到题还是没思路

这个情况非常典型。我分析过自己和身边人的经验,发现核心原因只有一个:一直按标签刷题,导致思维被“标签提示”绑架了。平时刷题的时候,题目列表已经告诉你这是二分题了,你不自觉地就知道往二分方向想,这不算真正的识别能力。等到面试或周赛,标题栏不会告诉你题型,识别能力不够就原形毕露。

解决方案就是前面反复强调的乱序刷题。如果你发现自己有这个症状,立刻停止按专题刷,改用随机刷题模式。LeetCode题单模式虽然方便但容易产生惰性,所以第三轮我建议手动打乱顺序,或者每天随机抽几道不同分类的题目。

另一种常见原因是“眼高手低”。很多人看题解觉得思路简单,就跳过了独立实现,结果自己上手就卡在边界条件或状态转移上。解决这个问题只有一个办法:每道题都必须自己独立写一遍,并且跑通所有用例,不能看过思路就当做过。

7.2 二分法死循环和边界错误怎么排查

二分答案是LeetCode网站上最容易写错的一类模板,错误表现集中在死循环和返回错边界上。我提供一个排查套路,按顺序检查三步。

第一步,检查循环条件。如果用的是left < right,那么循环体内一定有一个赋值是left = mid + 1,另一个是right = mid。如果用的是left <= right,循环体内通常是left = mid + 1和right = mid - 1。两种模板不要混用,混用是死循环和越界的最常见原因。

第二步,检查mid的计算。如果left和right都很大,直接写(left + right) // 2可能溢出,建议写成left + (right - left) // 2。Python里整数没有溢出问题,但如果切换到其他语言,这个细节就是大坑。

第三步,检查答案的语义。你要想清楚最后返回的变量到底代表“最后一个不可行点”还是“第一个可行点”。875题里我们返回的是left,因为left在退出循环时指向的是第一个满足can_finish的速度。如果你在写别的二分答案题时发现结果总是差1,大概率就是边界收缩写反了。

7.3 时间复杂度和运行超时:你的解法配得上题目的数据范围吗

很多人在LeetCode上遇到TLE,第一反应是优化代码常数,其实大多数时候是算法复杂度根本不对。拿875来说,如果你用了从1到max(piles)逐一尝试速度的做法,复杂度就是O(n*m),m达到10的9次方的时候,跑几个月也跑不完。这时候你优化判定函数里的一两个判断语句,该超时还是超时,因为问题的复杂度级别就没有降到对数级。

正确的思考方式应该是:看到数据范围的第一秒就估算复杂度。一般来说,如果n到10的4次方量级,O(n^2)可以勉强接受;如果到10的5次方以上,O(n^2)就完全不能碰,必须往O(n log n)或O(n)方向想。875的n是10的4次方,但值域m是10的9次方,所以整体复杂度应该朝着O(n log m)设计,也就是二分答案加一次遍历判定。这套复杂度估算方法不仅在LeetCode适用,在工作中的性能优化也一样适用。

7.4 心态崩了怎么办:第三轮刷题的心理建设

最后聊点非技术的。第三轮刷题是一个痛苦的过程,因为你的错误会变得特别扎眼。第一轮你可以安慰自己“我是新手不会很正常”,第二轮可以安慰自己“我还在熟悉阶段”,但第三轮错了就会觉得“我是不是不适合学这个”。

我自己经历这个阶段时,给自己定了一个止损策略:每道题最多卡25分钟,不管有没有做出来,时间一到就停下来复盘。复盘时只做两件事,一是记录这道题的错因,二是找一道同类变种题隔天再做。这种方式既不会因为死磕浪费时间,也不会因为频繁放弃而打击信心。刷题是一个重复练习就能形成条件反射的过程,心态平稳其实比智商重要得多。

另外我特别建议大家找一个“题伴”,两个人每周同步刷题进度、互相讲题。给别人讲题是检验自己是否真正理解的最快方式,很多自己以为懂了的题,一开口就发现漏洞百出。热题100三轮刷下来,如果身边有个人一起讨论,效率和坚持的时间都会明显提升。

返回列表