"Studyless,Studysmart;Trustyourself,Braceloneliness."前言本文我将分享给大家一套我自己使用良久并觉得非常高效的学习论,它可以运用到L......
"
Studyless,Studysmart;Trustyourself,Braceloneliness.
"
前言
本文我将分享给大家一套我自己使用良久并觉得非常高效的学习论,它可以运用到LeetCode上的刷题,也可以generalize到生活中涉及到学习以及记忆的方方面面。当然,本文将以LeetCode刷题为casestudy去进行讲解。更具体一点,我会教大家如何运用该学习论在4个月的时间内从0算法基础到实打实刷满500道题,并且形成长期记忆,同时具备高效解决各种同类型题目的能力。
自我介绍
我是Eason,是一名现在就读于CMU,CS院AI相关Master的研二学生。在我的求职备战期间,我是一名忠实的LeetCode用户,并最终凭借LeetCode这个平台给予的各方面帮助和资源拿到了北美Facebook(Meta)的Full-TimeOffer。时隔数月,我怀着一颗感恩的心回到这里,希望可以给大家分享下自己在4个月的备战期间积累的一些个人经验,尽可能地帮助大家少走弯路。本文篇幅较长,但诚意满满,力求字里行间具有逻辑性,连贯性以及可读性。
刷题时间线
我准备刷题的时间点非常晚(Master第一年全部用来刷GPA了,没有做任何面试准备,甚至没有实习,现在回首坦诚地讲有一丝后悔)。真正开始有规律地准备刷题大概是在第二年的7月到10月这四个月的时间,这四个月我在LeetCode上大概有4500个左右的commits,总共solve约550道题(难度分布大概是4:6:1),11月则是几乎全部用来巩固旧题,进行各种面试前的最后冲刺。
方法论概要
我想要给大家分享的这套方法论原理并不复杂,里面的每一点单独拎出来屏幕前的你或许都有所耳闻。但倘若想要长时间地(三个月以上)将它们全部贯彻,做到收益最大化,却真的需要很强的毅力和自制力。我自己本人大概用了三年时间才慢慢地适应其节奏。我坚信,如果你可以在四个月的时间将其执行到底,绝大部分company的算法论对你而言将不再是任何阻碍。
简单来讲,它可以总结为以下4点:
1.始终保持匀速前进,既不松懈倦怠,亦不急于求成
2.定时归纳总结,按类训练
3.深度理解人的记忆规律,高频率高效复习
4.拥抱孤独,过滤外界杂音,平稳心态
下面让我们逐条剖析。
Section1:始终保持匀速前进
对于“每天刷多少题”这个问题的探讨,主要分为两大流派,我姑且将它们称为“题海流”和“归纳流”。假设质量和题量的乘积为定值,“题海流”更主张牺牲部分的质量,通过题海战术大量刷题,做到以量取胜。而“归纳流”则更求稳,偏向于求质不求量,所以一天可能做不了几题,但做一题消化一题,且每做完一类题马上停下脚步投入大量精力进行归纳总结。
Inshort,“题海流”是绝对不适合任何长线任务的。如果刷题备战期可以缩短到只有7天,这一流派或许能够起到奇效,但是绝大部分人的备战期是3个月甚至更久的时间。倘若你在马拉松的前10千米就开始冲刺了,要不了多久你就会觉得身心俱疲。因此,匀速前进就显得至关重要。
匀速前进是“归纳流”最核心的思想之一。按照我个人的经验,即便是full-time刷题想要快速脱产,一天的题量也绝对不要超过5~6题,如果是part-time,标准大约减半。我个人的节奏是一般是一天4~5题,早上两题,写完休息。下午再做两题,并且复习早上做的题,写完再休息。晚上只做一题或者一题都不做,利用全部时间来复习归纳一整天做的题(关于为什么要将一天时间进行这样的切分以及为什么要这样复习,section3会进行详细解释)。
Again,不要greedy,绝大部分人每天的精力是有限且平均的,你今天做的事情超标了,看似赚到了,实际上是在透支明天的自己,你每透支一次自己,节奏就会乱一次。而节奏每乱一次,将其调整到正轨又需要大量的精力,所以从全局的角度来讲你其实是亏损的。另外,私认为每天都能够保质地完成4~5题其实已经非常了不起了,这只有很少一部分人能够长期坚持下去。大部分人都是一周一小停,两周一大停,而这则是非常低效的学习方法(后文会解释)。
归纳流另外一个核心思想则是归纳,关于“何时归纳”以及“如何归纳”等问题我会在接下来的section2中进行详细展开(避免本section篇幅过长)。
Section2:定时归纳总结,按类训练
上个section我们从每个人每天精力守恒的角度阐述了匀速前进的重要性,我们也讨论了“题海流”可能会带来的一些问题。这个section,我们将深度讨论归纳二字的重要性,它是题海流最缺乏的要素,也是私认为是刷题(或者是学习任何事物)“最强大的核武器”。
通俗地讲,归纳其实就是尝试在众多同类事物之间挖掘普遍规律,并试图利用该规律去高效地解决更多同类问题。到此,你应该能够读出进行归纳总结的前提条件是先聚集特定数量的"同类事物"。换句话说,刷题一定要同类型题目一起刷,切忌各种题型混在一起乱刷。比如,我想攻克二分法类题型,那么我这几天甚至这一周就应该全部做二分法相关的题。随着时间的推移,你会慢慢领悟到,在进行了大量针对性的同类型训练后,隐藏在事物深层的普遍规律往往会自然而然地浮出表面。倘若此时能够停下片刻,对其进行归纳和总结,我们得到的benefit将会是在各种题型之间盲目切换的数倍。
这里我给大家一个具体的案例:下面这篇文章是我通过大约五天时间训练完绝大部分滑动窗口类型的经典题后,再用2天时间归纳总结的一套思维框架。运用它可以很快秒杀绝大部分该类型中档题。而那些同类型的困难题,到头来你会发现也只是基于同一框架多加了几个components(其他框架)而已,其核心思想依旧不变。
Section3:深度理解人的记忆规律,高频率高效复习
或许你之前已经有所耳闻,人的记忆是具有规律的。人的记忆大概可以被划分为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),也能做个八九不离十,并且把思路讲得非常清楚(而这往往是很多公司更为看重的)。
注意,这里并不是想要鼓励大家去背题,面试当中遇见原题更像是一种面试官对你的恩赐,可遇而不可求。正确的期待应当是默认每一道题都是“新题”。这里的“新题”之所以带引号是因为严格意义上的新题很少存在,它们大概率只是之前训练过的一类题中的一个变种。而这一基本事实和机器学习领域的训练模型极为相似。
去训练一个模型之前,我们通常先将数据分为训练集和测试集。我们用训练集去训练模型就好似我们在LeetCode上刷题一样,其目的是去增加知识储备的广度和深度。而用测试集去对“新事物”进行预测就可类比成面试官拿“新题”测试我们。训练模型这一过程就好似刷题的归纳总结,你归纳的越好,你的拟合性以及性能就越强。这里再一次强调归纳总结的重要性:不要成为一个只会背诵训练集的劣质模型,尝试去理解和归纳你手中的“数据”,时间足够长了,你或许会发现这世上再无新题。
这套根据个体记忆规律量身定做的复习方法虽然功效异常强大,但想要长期的坚持却需要非常强大的毅力和自制力(最后一个section我会着重讨论如何锻炼它们)。
Section4:拥抱孤独,过滤外界杂音,平稳心态
遗憾的是,光有一套系统的学习(刷题)方法依然是不够的,如何调节自己的心态并使之始终平稳,对于跨度数月之长的备战期来说甚至显得更为重要。我平稳自身心态的办法有两点:
(1)拥抱孤独
(2)过滤外界杂音
这里的拥抱孤独,不是要教唆大家去成为一个孤独的人,而是想要去强调孤独实际是人与生俱来的一种属性,我们要做的不是去逃避它,而是去接纳它。很多小伙伴在备战期间都会因为孤独感而乱了心神,必须要加入各种刷题打卡群,相互监督群才能放心。然而这种“放心”本质上却是虚假的,不可靠的。我起初的时候也加了很多各式各样的群,削尖脑袋试图“融入”某个群体从而得到特殊的庇护,但到头来只会发现绝大部分的这种群除了带来无谓的焦虑外,很难起到丁点正面作用。直到后来方才发现自己的孤独感反而可以有效利用成为自身最强大的武器。
对于做算法题这种需要投入大量精力去思考的task而言,独立思考的能力往往大于一切。对于之前介绍的归纳法而言更是如此,你更多需要倾听的是自己内心的声音,你想要总结的也是那些属于自己的思维框架。这通过把希望寄托于各种陌生人刷题群是很难实现的。然而,我并非暗示大家不要去学习他人的东西。事实恰恰相反,别人好的题解,好的文章我们更要认真的去研读,这就和做发明一样,很多伟大的发明实际上都是基于前人的方法上加以改进而得出的,但这丝毫不影响它们的伟大。因此,我想要表达的是希望大家不要从主观意识上抗拒自身的孤独感并不断地寻找庇护。你不需要任何庇护,至少对刷算法题这件事而言,倘若你能运用好LeetCode社区提供的资源,不断强大自身的毅力和信心,再配合使用本文介绍的学习论,你已经完全具备打败它的一切潜质。
拥抱孤独的另外一个好处就是可以帮助我们过滤外界杂音。在之前长达四个月的备战期间,我曾选择近乎彻底地不再登录自己的微信以及各大社交平台。其目的只有一个,那就是抗噪。没错,我们不得不承认互联网给当今这个社会带来了种种便利,但也不得不承认如今的互联网是聒噪的,各种社交平台尤甚。里面充斥着各种散播焦虑,攀比和凡尔赛的言论,以及花样繁多的各种洗脑广告和文章。稍有不慎,你就会被“污染”,你就会潜意识地跟着大众做那些大众认为正确的事情,而丧失了自己独立思考的能力。别人买房,不代表你也要买房;别人买车学车,不代表你也要买车学车;别人炒股,不代表你也要炒股;别人做任何他们想做的事情都跟你无关,老天赐予你的原本是一个独特而有趣的灵魂,但当有一天你的意识被你口中的“别人”所左右之时,你最宝贵的独特性也将不复存在。
结尾
以上就是我想要分享给大家的全部内容。人生苦短,能在有限之人生长期坚持一件事情并将其做好实属不易。刷题之路长路漫漫,我真诚的希望大家能够稳住自己的心态,隔离外界的干扰,用最科学和最高效的方法去学习,当你未来回首之际,你将会发现自己从中受益无穷。马上暑假就要来临了,下一届秋招早已迫在眉睫,各位朋友们,倘若此时不动,敢问各位又更待何时呢?
阅读原文链接:论如何4个月高效刷满500题并形成长期记忆-力扣(LeetCode)
BY/
本文作者:Eason(力扣个人主页)
编辑版式:Alex