怎么刷题?LeetCode (和高中数学)刷题思路分享
怎么刷题?LeetCode (和高中数学)刷题思路分享
目录
不敢说什么刷题方法秘籍,我才刚开始做二十多题……只是受高中数学的启发,有了一点刷题的猜想,就分享一下吧,当然方法还没有经过长时间的实践,不一定有用,看个乐呵当启发就行了。
由于 LeetCode 也是半个应试、做题,所以我想可以使用按照高中刷数学题的应试方法来做。这个方法在高中还是挺管用的,甚至都让我有点喜欢上数学。
对于高中数学,方法基本是找到好题+模式识别(钻透整个题目)+重复(多做几遍),模式识别搞定深度,重复搞定广度,下面我们分别介绍这两个方法。
模式识别
什么是模式识别?其实和 AI 的“模式识别”很像了。简单来说,模式识别就是“特征”和“解法”的映射。
首先我们要找到题目的“解法”。对于一个题目,我们不会做,自然要去看答案,看完答案后,大概率会有“我怎么这都想不到”“它这个解法怎么可能有人想得出来”这些想法。第一次做不出来其实是很正常的,不是“我不适合学数学/写代码”,也不是“我太笨了”——大部分人的“恐惧症”来源于这里,其实是我们对自己的要求太高了。事实上,这些解法你就应该想不出来, 否则也不用在这里做题了。对于新手,方法是用来学习的,不是“想出来”的。就像你学完微积分之后,难道会感叹自己“怎么不能像牛顿和莱布尼茨一样想不出来微积分”因而认为自己不适合学数学吗?好吧微积分可能太难了——你学完竖式乘法,你难道会因为“没有靠自己发现两个数的乘法居然可以用列竖式解决”而责备自己太笨了、不适合学数学吗?显然也是不会的。因此,不会就学,饿了就吃,困了就睡,就这么简单。
当我们把答案看作纯粹的“学习材料”之后,内耗的自责就会少了不少,当然其中一定会经历一些看不懂答案之类的波折,可以通过视频课程、AI 询问和巩固基础来解决。
当我们看懂了答案后,我们通常可以从题目中看出一些解法,比如它用了极坐标方程、用了裂项相消、用了双指针、用了滑动窗口这些明显的解法,当然如果我们再仔细找找,我们还能发现一些没有人命名过的奇怪的操作,这也算一个解法。一道简单的题,通常只用到了一两个方法,一道复杂的题目,一定是用了不少复合的方法,比如 LC143 重排链表,就用了快慢指针、链表反转、拆分后处理重组这样三个方法。
接下来才是模式识别的重头戏,也就是“特征”。前面说到,模式识别就是特征和解法的映射关系。那么,一个解法,对应的就是一个特征。这个特征就存在于题目中。换句话说,答案中的方法,一定在题目中以“特征”形式有所展现。题目中发现了这个特征,就决定了这一题需要使用到这个特征对应的解法。光说还是太抽象了,我们看一个简单的例子。
模式识别示例
我们就用 LC143 重排链表举例。143. 重排链表 - 力扣(LeetCode)
上面说到这道题用到了三个方法,我们给出这三个方法对应的特征在哪里:
- 链表反转对应特征:重排后的链表,是左半边顺序、右半边倒序后拼接而成的
- 快慢指针法对应特征:要分成左半边和右半边
- 拆分后处理重组对应特征:处理后的链表是通过原有节点穿插形成的
我们可以看到特征并不总是特别简练、精确,可能和上下文有很大的关系,还有可能是推断出来而非在题中直接写出来的。当然,我们可以剥离上下文来提取这些特征:
- 链表反转对应特征:需要倒序链表
- 快慢指针法对应特征:需要找到中点
- 拆分后处理重组对应特征:需要重排链表
这样,这些特征就可以运用到更多的题目上去,当题目做得多了,这些特征并非一对一的关系,我们可以从不同的特征中提取出共同点,更进一步抽象,比如:
- 链表反转对应特征:从后往前遍历、反转某一部分
- 快慢指针法对应特征:需要找到找到中点、倒数第 k 个点、环的入口、是否有环
- 总结:在不知道链表总长度的情况下进行和位置相关操作
- 拆分后处理重组对应特征:归并排序两个有序链表、将链表按 x 划分成两部分、重排链表
- 总结:需要对链表不同部分进行简单操作,然后将结果组合起来。
这样,在新的题目中,如果出现这些特征,我们就知道要用之前那个解法。当然解法在不同题目中的形式也不一样,需要勤加练习。不过有了方向总比一头雾水要好得多。
模式识别的指导意义
了解了原理后,我们就能发现,模式识别给我们“做题”和“复盘”这两个基本过程给出了具体的待办清单和目标。
复盘错题、不会做的题时,我们要做的就是从答案中分离出一个个的解法,然后绞尽脑汁找出这些解法的特征,然后抄在小本本上,最好附上例题防止遗忘。这一个步骤可以用 AI 辅助,在后文会介绍到。
在做新题的时候,我们要做的就是尽量地识别出题目中我们之前总结过的特征,然后列出这些特征所需要的解法,按照这些解法来思考本题的做法。
这两个过程是“做题”这个认识活动的基本要素,当然只简简单单靠这两个过程是远远不够的……
模式识别的普遍性和特殊性
模式识别看起来非常地简单、通俗易懂,让人感觉参悟了某种武林秘籍,迫不及待地打开题单跃跃欲试,但是很快我们就会发现问题没有那么简单。
首先,“解法”方面。
某些方法没有名字,我们需要自己命名,比如 LC143 中的那个拆分重组,就是我乱取的名字。
某些方法在不同的题目中,有细微的差别。比如二分查找算是一个方法吧?就光是二分查找的模板就有好几种,对不同题目还可能需要使用不同的模板。裂项相消是一个方法吧?但是裂项相消有十几种变式,还无法完全覆盖,题目可能创新。
某些方法太过抽象,好像只能在这一道题的特殊情景中使用,没有办法找出什么比较普遍的特征……
这些问题指向同一个大问题:一些方法似乎是一种“思想”“思路”,而非一种固定的解法,它们没有固定的名字、没有固定的模板、没有死板的“特征”限制,似乎跳脱于模式识别的法则之外。
其次是“特征”方面。某些特征实在太复杂,根本没有普适性,各种条件限制,让你觉得不可能有第二道题再出现这样的特征。某些特征太过隐蔽,藏在二级结论、推论、图像中,第一遍看很难发现。某些特征明明已经做了很多遍,在题目中明显出现时自己还是没有看到这个特征……
这些问题怎么解决?事实上,面对各种复杂的情况,我们只需要把它们当作“特征”“解法”记下来就好了,没有名字?取一个名字。细微差别?小本本上标注一下。没有普适性?那就应对一道题就好了,一个方法能做一题是一题。特征太复杂?记下来就好了。特征太隐蔽?记下来就好了。我们不用追求完美的“特征”“解法”强烈关联、对应,也不用追求一个特征和解法能应付个几十道题,只需要有大概的印象、慢慢积累即可。
这也反映出模式识别不是万能的,它需要搭配一个非常重要的手段,就是重复。
学习的本质是记忆,记忆的本质是重复
如何重复
这里的重复,就是对我们做过的、复盘过的题目大量地重做。对于一个特征和解法,不可能抄在小本本上就能学会,对于一道题,也不可能做一遍就能记住(所以不要再用做过了还不会做来否定自己的智商,这意味着你是一个正常的智人),我们只有大量地重复这个映射关系,大量重复做题的过程,才能在大脑中建立相应的神经通路,形成“肌肉记忆”。就像我们看到乘法,我们会想用哪个方法计算吗?正是因为重复的次数多,那些特征才能印在脑海里,当它们以各种形式出现的时候,才都不会逃过我们的肌肉记忆的快速反应。
另外,重复的另一个维度,就是大量地、广泛地做题,只有题量够多、范围够广,才能接触到尽可能多的解法和特征。 而这些解法和特征,在某个“目标”的天花板下,基本上是有穷的。比如说,高中数学考到 135+,比如力扣熟练做出 middle 题,在这些目标限制下,我们所要求要接触的解法和特征其实是很有限的,并非我们想象中的浩如烟海的“题海”。而且,只有题目多了,我们才能见识一个特征、一个解法在不同题目中的不同的“个性”,从而才能更好地认识它们的“共性”,掌握它们的本质。
具体到行动上, 在重复做之前做过“复盘”操作的题目的时候,我们要尽量地回忆我们当时提取了哪些特征、解法,还能不能在题目中发现这些特征?发现了特征后能不能想起对应的解法?想不起来就看看小本本,以此加深对这题涉及到的模式识别的记忆。
在重复做题中,要尽量让自己做到上述过程,如果只是单纯通过记忆背出了答案,却不知道是为什么要这么做(没有想起特征)、不知道答案的思路过程(没有想起分解的解法),这样是无效的,这种记忆的遗忘会非常迅速。只有有逻辑的、有联系的记忆才能印象深刻。 相反,重做题目的时候,如果我们能回忆起来一些特征和解法,即使没有完全做出来,这样的复习也是有效的。
重复固然好,但是怎么重复?重复几遍?什么时候复习?这些问题还需要更具体的答案,那就是间隔重复。
重复的升级:间隔重复
我们说记忆的本质是重复,其实更准确来说是间隔重复+提取。
间隔重复是指学习完一个内容后,按照遗忘曲线先快后慢的规律,采用先短后长的不同间隔时间来多次重复,比如分别在学习新内容的“1 天、2 天、4 天、7 天、15 天”后进行复习(重做),就可以高效率地加深记忆,以求以较少的重复次数达到最好的记忆效果——这正是我们所需要的,毕竟没有人想每天把所有做过的题目做一遍。
提取顾名思义就是从大脑中将记忆调用出来,研究表明把记忆调用出来会比单纯地输入,对记忆的加深效果要好得多。我们不看答案和小本本做题,就是一种提取特征和解法、加深记忆的过程。
间隔重复也灵活和机械的高下之分。比如 10 道题目,有 3 道特别简单,意味着更容易记住,所以间隔时间应当相比更难的题目长一些,有 3 道特别难,意味着更难记忆,所以间隔次数应该多一些、间隔时间应该短一些。如果全部采用“1 天、2 天、4 天、7 天、15 天”这样的复习间隔,显然就不够合理。因此,对于这种有反馈的学习,我们可以采用一些科技辅助,用算法来帮助自己更高效率地加深记忆。
Anki 就是间隔重复算法的一个全平台应用。根据用户的反馈“重来”“困难”“良好”“简单”,来判断题目的难度,用一系列算法计算每道题目的复习时间,提高记忆效率。目前 Anki 中支持的 FSRS 间隔重复算法是目前世界上最高效的记忆重复算法之一(记得在预设设置中打开 FSRS 开关)。
制作卡片非常简单,首先创建“LeetCode 刷题”牌组,然后只需要创建新卡片,在正面放上题号,反面留白就可以了,后续可以在反面写上一些笔记(比如这道题的若干特征和解法)。当复习时,Anki 会自动按照算法把需要复习的卡片展示给我们。卡片出现时,打开力扣,把这道题按前述重做的原则回忆特征和解法、敲出答案提交。如果完全想不起来就点击“重来”,能想起来大概的框架,但是有卡点,选择“困难”,能做出来但是磕磕绊绊选择“良好”,完全回忆起来所有内容、题目做得很熟练,选择“简单”。Anki 会自动为我们安排每道题接下来复习的时间。我们只需要每天打开 Anki,完成复习任务,当然也不要忘记做新题,每做完、分析完一道新题,就新建一张卡片。
Anki 非常强大,可以辅助几乎所有学科的学习,我们用到的只是其中最简单的功能。关于 Anki 的介绍和基本使用方法,知乎上有许多大佬的文章,很值得了解一下,这里就不班门弄斧了。
附:AI 辅助 Prompt
题解看不懂?模式识别刚开始不会用?特征解法找不出来?我们都可以用 AI 辅助!下面这个 prompt,可以让我们在获得优质题解的同时,获得本题的模式识别。我认为 Gemini 2.5 Pro 的模式识别能力已经和熟练使用模式识别的人差不多了。
当然,更重要的还是自己内化这些特征和解法,不要妄想看过 AI 的答案就能一次掌握题目,通常一道题要复习很多遍才能完全“内化”。我们在看了 AI 的模式识别“答案”后,也应当自己尝试提取一下解法,找一下特征,和 AI 的答案对比,很快就会取得进步。
以下是 Prompt 原文,发送给 AI 或者设置为系统提示词后,直接发送代码答案或者题目给它即可。
1 | |
实践
后续应该会分享这个方法的实践报告,也会分享一些总结好的特征。间隔重复搞定记忆,模式识别搞定深度,就是这个方法的精髓。