一篇文章教你如何刷Letcode进大厂
论如何4个月高效刷满 500 题并形成长期记忆
Study less, Study smart; Trust yourself, Brace loneliness.
前言
本文我将分享给大家一套我自己使用良久并觉得非常高效的 学习论,它可以运用到 Leetcode 上的刷题,也可以 generalize 到生活中涉及到学习以及记忆的方方面面。当然,本文将以 Leetcode 刷题为 case study 去进行讲解。 更具体一点, 我会教大家如何运用该学习论在 4 个月的时间内从 0 算法基础到实打实刷满 500 道题,并且形成长期记忆,同时具备高效解决各种同类型题目的能力。
方法论概要
我想要给大家分享的这套方法论原理并不复杂,里面的每一点单独拎出来你或许都有所耳闻。但倘若想要长时间地 (三个月以上) 将其贯彻, 做到受益最大化,却需要很强的毅力和自制力。我自己本人大概用了三年时间才慢慢地适应其节奏。我坚信, 如果你可以在四个月的时间将其贯彻到底,绝大部分 company 的算法轮对你而言将不再是任何阻碍。
简单来讲,它可以总结为以下 4 点:
- 始终保持匀速前进,既不松懈倦怠,亦不急于求成
- 定时归纳总结, 按类训练
- 深度理解人的记忆规律,高频率高效复习
- 拥抱孤独, 过滤外界杂音, 平稳心态
下面让我们逐条剖析。
Section 1: 始终保持匀速前进
对于 “每天刷多少题” 这个问题的探讨,主要分为两大流派,我姑且将它们称为 “题海流” 和 “归纳流”。 假设质量和题量的乘积为定值, “题海流” 更主张牺牲部分的质量,通过 题海战术 大量刷题, 做到以量取胜。 而 “归纳流” 则更求稳, 偏向于求质不求量,所以一天可能做不了几题,但做一题是一题,且每做完一类题马上停下来投入 大量精力 进行 归纳总结。
在最开始的时候,我是 “题海流” 的忠实信徒,平均一天 8 ~ 10 道新题起步,发力最猛的时候甚至一天要做 20 道题。我不得不承认在刚开始刷题的初期,我可以明显感受到 “题海流” 给予我的强大 正反馈,每当自己看到自己的题量蹭蹭蹭上涨,那种兴奋与成就感总是溢于言表。然而,没过多久,我就发现了一个很严重的问题: 即无论我做多少道题目,碰见新的题我大概率还是没有思路, 必须要看题解。更糟糕的是,一两周过后,即便是遇到了我之前已经做过的旧题,我可能依旧不会做。 刹那间,起初的那种缥缈的 正反馈 瞬间被转化为了与其对立且强度是其数倍的 负反馈。我开始频繁地怀疑自己, “我是不是不适合学算法?”,“为什么我做了这么多题还是看不到进步?” 等问题席卷而来。然后你会发现这是一个恶性循环,持续不断的负反馈会不断摧毁你的自信,而你不断被侵蚀的自信心则会给予你更多的负反馈。
In short, "题海流"是绝对不适合任何 长线任务 的。如果刷题备战期可以短到只有 7 天,这一流派或许能够起到奇效,但是绝大部分人的备战期是 3 个月甚至更久的时间。如果你在马拉松的前 10 千米就开始冲刺了,要不了多久你就会觉得身心俱疲。因此,匀速前进就显得至关重要。
匀速前进是"归纳流"最核心的思想之一。按照我个人的经验,即便是 full-time 刷题想要快速脱产,一天的题量也绝对不要超过 5 ~ 6 题, 如果是 part-time, 标准大约减半。我个人的节奏是一般是一天 4 ~ 5 题, 早上两题,写完休息。下午再做两题,并且复习早上做的题,写完再休息。晚上只做一题或者一题都不做,利用全部时间来 复习归纳 一整天做的题 (关于为什么要将一天时间进行这样切分以及为什么要这样复习, Section 3 会进行详细解释)。Again, 不要 greedy, 绝大部分人每天的精力是有限且平均的,你今天做的事情超标了,看似赚到了,实际上是在透支明天的自己, 你每透支一次自己,节奏就会乱一次,所以从全局的角度来讲你其实是亏损的。 另外,私认为每天都能够保质地完成 4 ~ 5 题其实已经非常了不起了, 只有很少一部分人能够长期坚持下去。 大部分人都是一周一小停,两周一大停, 而这是非常低效的学习方法 (后文会解释)。
归纳流另外一个核心思想则是 归纳, 关于 “何时归纳” 以及 “如何归纳” 等问题我会在接下来的 Section 2 中进行详细展开 (避免本 section 篇幅过长)。
Section 2: 定时归纳总结, 按类训练
上个 section 我们从每个人每天精力守恒的角度阐述了 匀速前进 的重要性, 我们也讨论了 “题海流” 可能会带来的一些问题。 这个 section, 我们将深度讨论 归纳 二字的重要性, 它是 题海流 最缺乏的要素,也是私认为是刷题 (或者是学习任何事物) “最强大的核武器”。
通俗的讲,归纳 其实就是尝试在众多相似事物之间寻求普遍规律,并试图利用该规律去高效地解决更多的同类问题。到此,你应该可以读出进行 归纳总结 的前提条件是先 具备一定数量的 “同类事物”。换句话说,刷题一定要同类型题目一起刷,切忌各种题型混在一起乱刷。比如,我想攻克 二分法 类题型,那么我这几天甚至这一周就全部做 二分法 相关的题。要相信,在进行了大量针对性的同类型训练后,隐藏在事物深层的普遍规律往往会自然而然地浮出水面。倘若此时能够停下片刻,对其进行归纳和总结,我们得到的 benefit 将会是在各种题型之间频繁切换的数倍。
这里我给大家一个具体的案例: 下面这篇文章是我通过大约五天时间训练完绝大部分 滑动窗口 类型经典题目后,再用 2 天时间归纳总结的一套思维框架。运用它可以很快秒杀绝大部分该类型中档题。而那些同类型的困难题,到头来你会发现也只是基于同一框架多加了几个 components (其他框架) 而已 ,其核心思想依旧不变。
[滑动窗口真滴简单!] 闪电五连鞭带你秒杀12道中档题 (附详情解析)
对于其他题型, 比如二分法,二叉树 (前中后序),回溯等等,我采取的策略都是像这样逐一进行攻破: 即一段时间内 (一般是5 ~ 7天) 只做该类型题目, 结合其他质量高的题解以及自身的见解归纳总结出一套属于自己的框架。 我现在可以很坦诚的讲,当我从 题海流切换到 归纳流并将后者彻底实施时,我认为我的 efficiency 至少提升了 5 个量级。与此同时, 我得到的 正反馈 (比如别人对自己的认可, 以及发现通过归纳, 自己的解题能力正不断地得到提升等等) 要远远大于 负反馈。所以我会越刷越有自信,会越刷越想去攻克更多的题,即将之前的 恶性循环 成功地转化成了 良性循环。
Section 3: 深度理解人的记忆规律,高频率高效复习
或许你之前已经有所耳闻,人的记忆是具有规律的。人的记忆大概可以被划分为 3 种类型 (也有的人将其划分为 2 种):
(1) 短期记忆: 持续若干天或者一两周的记忆
(2) 中期记忆: 持续数周或者几个月的记忆
(3) 长期记忆: 持续数年甚至永世不会消逝的记忆。
学习某项技能 (包括刷题),其终极目标往往是去形成长期记忆,因为它的价值最高,一旦获取往往很难再失去。换句话说,一旦你会做一道或者一类题目之后,你或许永远都会做。文章开头介绍的 “题海流” 帮助形成的往往是短期记忆 – 价值最低的记忆,而把后面讨论的 “归纳流” 加上这个 section 即将讨论的记忆方法综合在一起则是为了帮助形成长期记忆。
形成长期记忆的方式非常简单,即 频繁的重复刺激。人们永远不会忘记的总是那些需要不断重复的东西: 怎么用筷子吃饭,怎么穿衣装扮,怎么说某种语言等等。之所以永远不会忘记它们,正是因为我们每天都在潜移默化地反复刺激大脑如何去运用它们。刷题或者 generalize 到学习某种技能亦是如此。因此,这里可以总结出另外一个结论: 复习旧题的重要性要远远大于做新题。这一点其实和我们之前讨论的内容相互佐证,彼此互应。
那么该如何高效地复习并且形成长期记忆呢?这里不得不介绍一下艾宾浩斯遗忘曲线了。德国的心理学家艾宾浩斯告诉我们,人对于知识的遗忘速度遵循 “先快后慢” 的原则。学得的知识在一天后,如不抓紧复习,很快就只剩下原来的25%。随着时间的推移,遗忘的速度减慢,遗忘的数量也就减少。去抵抗这种遗忘,最好的办法就是进行有规律的 (每 5 分钟,30分钟,12小时,1天,2天,4天,7天,15天,1个月,3个月,6个月) 复习。然而个人认为这个划分有点过细了,读者可以结合自身的情况进行调整。我个人的复习规律是 每 2 小时,12小时, 2天, 7天,15天,一个月, 三个月。 这也是为什么我在上文提及到我会将一天分为早上, 中午和晚上三个学习区段,每一个区段只刷很少数量的题 (1 ~ 2题),并且开始每一个区段之前,都会首先复习之前做过的题,甚至晚上的时候一题也不做,全部精力都用来复习。
在运用这一套记忆方法仅仅数周之后,我就发现我的记忆相对于之前来比变得 异常牢固,坚不可摧, 碰到之前做过的题目可以像哈希表一样用 O(1) 的时间做出响应, 当时还和朋友开玩笑感觉自己已经可以开始用 “脊柱做题”。 比如在 Facebook 的面试里我就遇见了共三道之前训练过的题,对于它们,我思考加上写完的时间平均下来大约只有 3 ~ 4 分钟。再结合运用之前介绍的 归纳法,我同时也具备了一定的 generalization 的能力。所以遇见同类型的题目,即便不可以在有限时间内 bug-free 的写完 (比如我面试的最后一道 hard 题 282),也能做个八九不离十, 并且把思路讲得非常清楚 (这往往是很多公司更为看重的)。
这套复习方法虽然功效异常强大,但想要长期的坚持却需要非常强大的毅力和自制力 (最后一个 section 我会着重讨论如何锻炼它们)。下面我给大家 share 一份 艾宾浩斯记忆曲线的 excel 表格, 大家下载后可以结合自身的记忆规律进行改进。
艾宾浩斯记忆曲线 excel 表格
同时也 share 给大家一份我个人强烈推荐使用的 track 自己刷题进程的 Notion 模板
Notion Track 刷题进展模板
同样的,建议结合自身的实际情况进行微调, 我个人调整过后的风格如下 (我会着重记录自己对于每一道题目的掌握情况):
最后便是一个在 Youtube 收获 1700 万观看量的讲学习方法的演讲, 其部分核心思想我已经在本文囊括,但依然建议每当自己又变得迷茫之际反复观看,认真消化。
Study less, study smart
上面 share 的这些资料建议大家结合自己的习惯搭配使用,它们真的可以起到事半功倍的效果哦!
Section 4: 拥抱孤独, 过滤外界杂音, 平稳心态
光有一套系统的学习 (刷题) 方法依然是不够的,如何调节自己的心态并使之始终平稳,对于跨度数月之长的备战期来说也至关重要。我平稳自己心态的办法有两点:
(1) 拥抱孤独
(2) 过滤外界杂音
这里的拥抱孤独,不是要教唆大家去成为一个孤独的人,而是想要去强调 孤独实际是人与生俱来的一种属性,你要做的不是去逃避它,而是去接纳它。很多小伙伴在备战期间都会因为孤独而乱了心神,必须要加各种刷题打卡群,相互监督群才能放心。然而这种 “放心” 实质上是虚假的。我起初的时候也加了很多很多各种各样的群,试图 “融入” 某个群体得到特殊的庇护,但到头来只会发现绝大部分的这种群除了带来无谓的焦虑外,很难起到半点正面作用。直到后来方才发现自己的孤独反而可以成为自身最强大的武器。
对于做算法题这种需要投入大量精力去思考的 task 而言,独立思考的能力往往大于一切。对于之前介绍的 归纳法 而言更是如此,你更多需要倾听的是自己内心的声音,你想要总结的也是那些属于自己的思维框架。这通过把希望寄托于各种陌生人刷题群是很难实现的。然而, 我并没有暗示大家不要去学习他人的东西。事实恰恰相反,别人好的题解,好的文章我们更要认真的去研读,这就和做发明一样,很多伟大的发明实际上都是基于前人的方法上加以改进得出的,但这丝毫不影响它们的伟大。因此,我想要表达的是希望大家不要从主观意识上抗拒自身的孤独感并不断地寻找庇护。你不需要任何庇护,至少对刷算法题这件事而言,倘若你能运用好 Leetcode 社区提供的资源,不断强大自身的毅力和信心,再配合使用本文介绍的方法论,你已经完全具备打败它的一切潜质。
拥抱孤独的另外一个好处就是可以帮助我们 过滤外界杂音。在之前长达四个月的备战期间,我曾选择近乎彻底地不再登录自己的微信以及各大社交平台。其目的只有一个,那就是抗噪。 我们不得不承认互联网给这个社会带来的种种便利,但也不得不承认当今的互联网是聒噪的,各种社交平台尤甚。里面充斥着各种散播焦虑,攀比和凡尔赛的言论,以及花样繁多的各种洗脑广告。稍有不慎,你就会被 “污染”,你就会潜意识地跟着大众做那些大众认为正确的事情, 而丧失了自己独立思考的能力。别人买房,不代表你也要买房; 别人买车学车,不代表你也要买车学车; 别人炒股,不代表你也要炒股; 别人做任何他们想做的事情都跟你无关,老天赐予你的原本是一个独特而有趣的灵魂,但当有一天你的意识被你口中的 “别人” 所左右之时,你最宝贵的 独特性也将不复存在。
所以不要再沉迷和流连于各种 伪群体 或者 伪社区 之间,最好的方式就是离开它们,或者有效控制它们,从而捍卫你的初心。那么什么样的状态或者是心态可以称之为平稳呢?私认为只要你可以做到 长时间地保持一个节奏,贯彻一个方案,不因取得阶段性成就而大喜,亦不因遭受阶段性挫折而大悲,心静如水,那么你离你的目标就真的不再遥远了。
结尾
以上就是我想要分享给大家的全部内容。人生苦短,能在有限之人生长期坚持一件事情并将其做好实属不易。刷题之路长路漫漫,我真诚的希望大家能够稳住自己的心态,隔离外界的干扰,用最科学和最高效的方法去学习,当你未来回首之际,你将会发现自己从中受益无穷。马上暑假就要来临了,下一届秋招早已迫在眉睫,各位朋友们,倘若此时不动,敢问各位又更待何时呢?
一篇文章教你如何刷Letcode进大厂相关推荐
- 一篇文章教你学会使用SpringBatch 监听器Listener
文章目录 一.SpringBatch监听器 二.搭建SpringBatch开发环境 三.监听器详细介绍 1.JobExecutionListener 2.StepExecutionListener 3 ...
- 一篇文章教你学会使用SpringBoot实现文件上传和下载
文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...
- 一篇文章教你学会实现模糊搜索结果的关键词高亮显示
一篇文章教你学会实现模糊搜索结果的关键词高亮显示 话不多说,先看效果图: 代码如下: <!DOCTYPE html> <html lang="en">< ...
- 一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite)
一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite) 一.什么是雪碧图? 雪碧图(CSS Sprite)又叫CSS精灵图,是一种网页图片应用处理方式,他允许你将一个页面设计到 所有零星图片 ...
- 一篇文章教你整合ssm配置,可以收藏。
所谓的ssm框架就是mybatis+spring+springmvc,下面一篇文章将带你了解如何整合ssm. 我上传了一个免费的解释资源,里面有这篇文章的一些个人解释,说的很幽默,简单的说明了为什么要 ...
- html网页怎么向文章,一篇文章教你学会HTML
html是学习做网页的基础,漂亮的网页与布局就是由有些html代码组成,大家看完这篇文章就可以简单的了解html了,多写多练. 如果你不致力于成为美工的话,那么作为开发人员,可以读懂HTML.必要时能 ...
- 一篇文章教你读懂Spring @Conditional注解
文章目录 一.Conditional简介 二.Conditional用法 1.Conditonal注解作用在方法上 2.Conditonal注解作用在类上 3.类上注入多个条件类 三.Conditio ...
- (第2篇)一篇文章教你轻松安装hadoop
摘要: 这篇文章将会手把手教你安装hadoop,只要你细心按照文章中的步骤操作,hadoop肯定能正确安装,绝对不会让你崩溃 博主福利 给大家赠送一套hadoop视频课程 授课老师是百度 hadoop ...
- 一篇文章教你正确解锁 代理ip 的使用方式,包含两个实战案例
前言 一.代理ip 1.1 代理ip简介 1.2 代理ip分类 1.3 代理ip的优点 1.4 代理ip的必要性 二.选择合适的平台 2.1 IPIDEA 介绍 2.2 IPIDEA 应用场景 2.3 ...
- 英文连写字体怎么练_一篇文章教孩子学会衡水英文字体,建议收藏!
"衡水体"实质上是衡水中学学生书写的手写印刷体, 随着中考高考电子阅卷的普及,采用简洁.工整.快速的字体进行书写成为必需,极大地迎合了阅卷老师心理和电脑显示特点.一定程度上有助于大 ...
最新文章
- 刚刚,2021QS美国大学排名发布!哈佛,斯坦福,MIT位列前三
- python教程书籍-程序员大佬,给Python零基础入门书籍教程的一些建议!
- SpringBoot_02 Spring的Java配置方式
- 我的心得:数据中心运维管理(一)
- java 中的2个接口 Comparable和Comparator
- DCMTK:创建和验证DICOM数字签名
- 天才基本法_强推|高人气合集狙击蝴蝶天才基本法春日玛格丽特难哄
- JAVA:说说你对序列化的理解
- haproxy概念和负载均衡
- 玩转Linux文件描述符和重定向
- 【视频教程】JEECG 入门视频教程
- python的第三方库是干什么用的-python一些工作用到的第三方库
- Csharp四种简单的排序算法
- java io中file类_java中IO常见的IO流和file类理论总结
- 基于hilbert变换的数字信号_基于Hilbert变换实现数字全息高精度相位重建.pdf
- 初中计算机课堂游戏设计方案,初中信息技术教案设计
- python用input输入整数列表_python中,用input()输入一个整数
- 网络模型可视化工具netron
- 新兴的计算机设备,澳洲新兴专业-计算机数控,你会心动吗?
- 不确定性推理——主观贝叶斯方法matlab实现
热门文章
- usb调试助手_米卓同屏助手 | 刷短视频必备,一键打通“任督二脉”,双端
- 【设计】松本行弘的程序世界
- ecshop ectouch 不支持html,ECShop上传的商品图片在ECTouch不能显示,怎么解决
- 日志管理系统,多种方式总结
- 怎么查看和下载高清谷歌卫星地图
- 【Winform】知识竞赛抢答计分管理系统 分普通答题 和 抢答答题2种模式 待完善。。。...
- VM虚拟机不被低版本兼容问题
- 魔百盒九联UNT402H,(芒果、南传、百视通)等通刷刷机固件
- 在 NXP iMX8 上进行 4K 视频播放测试
- wifi数据包解析_详细解析WiFi模块的基础知识