Study less, Study smart; Trust yourself, Brace loneliness.

原文:https://leetcode-cn.com/circle/discuss/jq9Zke/

前言

本文我将分享给大家一套我自己使用良久并觉得非常高效的 学习论,它可以运用到 Leetcode 上的刷题,也可以 generalize 到生活中涉及到学习以及记忆的方方面面。当然,本文将以 Leetcode 刷题为 case study 去进行讲解。 更具体一点, 我会教大家如何运用该学习论在 4 个月的时间内从 0 算法基础到实打实刷满 500 道题,并且形成长期记忆,同时具备高效解决各种同类型题目的能力。

自我介绍

我是 Eason, 是一名现在就读于 CMU, CS 院 AI 相关 Master 的研二学生。在我的求职备战期间,我是一名忠实的 Leetcode 用户,并最终凭借 Leetcode 这个平台给予的各方面帮助和资源拿到了北美 Facebook (Meta) 的 Full-Time Offer。时隔数月,我怀着一颗感恩的心回到这里,希望可以给大家分享下自己在 4 个月的备战期间积累的一些个人经验,尽可能地帮助大家少走弯路。本文篇幅较长,但保证干货和诚意满满

刷题时间线

我准备刷题的时间点非常晚 (Master first-year 全部用来刷 GPA 了,没有做任何面试准备,甚至没有实习, 现在回过头来其实有一些后悔)。真正开始有规律地准备刷题大概是在 second-year 的 7 月到 10 月这四个月的时间,这四个月我在 Leetcode 上大概有 4500 个左右的 commits,总共 solve 约 550 道题 (难度分布大概是 4 : 6 : 1), 11 月则是几乎全部用来巩固旧题,进行各种面试前的最后冲刺。

方法论概要

我想要给大家分享的这套方法论原理并不复杂,里面的每一点单独拎出来你或许都有所耳闻。但倘若想要长时间地 (三个月以上) 将其贯彻, 做到受益最大化,却需要很强的毅力和自制力。我自己本人大概用了三年时间才慢慢地适应其节奏。我坚信, 如果你可以在四个月的时间将其贯彻到底,绝大部分 company 的算法轮对你而言将不再是任何阻碍。

简单来讲,它可以总结为以下 4 点:

1.始终保持匀速前进,既不松懈倦怠,亦不急于求成

2.定时归纳总结, 按类训练

3.深度理解人的记忆规律,高频率高效复习

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 的这些资料建议大家结合自己的习惯搭配使用,它们真的可以起到事半功倍的效果哦!

Section 4: 拥抱孤独, 过滤外界杂音, 平稳心态

光有一套系统的学习 (刷题) 方法依然是不够的,如何调节自己的心态并使之始终平稳,对于跨度数月之长的备战期来说也至关重要。我平稳自己心态的办法有两点:

(1) 拥抱孤独
(2) 过滤外界杂音

这里的拥抱孤独,不是要教唆大家去成为一个孤独的人,而是想要去强调 孤独实际是人与生俱来的一种属性,你要做的不是去逃避它,而是去接纳它很多小伙伴在备战期间都会因为孤独而乱了心神,必须要加各种刷题打卡群,相互监督群才能放心。然而这种 "放心" 实质上是虚假的。我起初的时候也加了很多很多各种各样的群,试图 "融入" 某个群体得到特殊的庇护,但到头来只会发现绝大部分的这种群除了带来无谓的焦虑外,很难起到半点正面作用。直到后来方才发现自己的孤独反而可以成为自身最强大的武器

对于做算法题这种需要投入大量精力去思考的 task 而言,独立思考的能力往往大于一切。对于之前介绍的 归纳法 而言更是如此,你更多需要倾听的是自己内心的声音,你想要总结的也是那些属于自己的思维框架。这通过把希望寄托于各种陌生人刷题群是很难实现的。然而, 我并没有暗示大家不要去学习他人的东西。事实恰恰相反,别人好的题解,好的文章我们更要认真的去研读,这就和做发明一样,很多伟大的发明实际上都是基于前人的方法上加以改进得出的,但这丝毫不影响它们的伟大。因此,我想要表达的是希望大家不要从主观意识上抗拒自身的孤独感并不断地寻找庇护。你不需要任何庇护,至少对刷算法题这件事而言,倘若你能运用好 Leetcode 社区提供的资源,不断强大自身的毅力和信心,再配合使用本文介绍的方法论,你已经完全具备打败它的一切潜质。

拥抱孤独的另外一个好处就是可以帮助我们 过滤外界杂音在之前长达四个月的备战期间,我曾选择近乎彻底地不再登录娱乐以及各大社交平台。其目的只有一个,那就是抗噪。 我们不得不承认互联网给这个社会带来的种种便利,但也不得不承认当今的互联网是聒噪的,各种社交平台尤甚。里面充斥着各种散播焦虑,攀比和凡尔赛的言论,以及花样繁多的各种洗脑广告。稍有不慎,你就会被 "污染",你就会潜意识地跟着大众做那些大众认为正确的事情, 而丧失了自己独立思考的能力。别人买房,不代表你也要买房; 别人买车学车,不代表你也要买车学车; 别人炒股,不代表你也要炒股; 别人做任何他们想做的事情都跟你无关,老天赐予你的原本是一个独特而有趣的灵魂,但当有一天你的意识被你口中的 "别人" 所左右之时,你最宝贵的 独特性也将不复存在。

所以不要再沉迷和流连于各种 伪群体 或者 伪社区 之间,最好的方式就是离开它们,或者有效控制它们,从而捍卫你的初心。那么什么样的状态或者是心态可以称之为平稳呢?私认为只要你可以做到 长时间地保持一个节奏,贯彻一个方案,不因取得阶段性成就而大喜,亦不因遭受阶段性挫折而大悲,心静如水,那么你离你的目标就真的不再遥远了。

以上就是我想要分享给大家的全部内容。人生苦短,能在有限之人生长期坚持一件事情并将其做好实属不易。刷题之路长路漫漫,我真诚的希望大家能够稳住自己的心态,隔离外界的干扰,用最科学和最高效的方法去学习,当你未来回首之际,你将会发现自己从中受益无穷。马上暑假就要来临了,下一届秋招早已迫在眉睫,各位朋友们,倘若此时不动,敢问各位又更待何时呢?

最后

春招已经开始了,秋招也快来了,我们要提前准备好,背水一战!

大家可以加我微信(备注:校招),我拉你入校招专属群,一起学习,一起解决问题, 一起进步!

- END -


看完一键三连在看转发点赞

是对文章最大的赞赏,极客重生感谢你

推荐阅读

定个目标|建立自己的技术知识体系

大厂后台开发基本功修炼路线和经典资料

个人学习方法分享

你好,这里是极客重生,我是阿荣,大家都叫我荣哥,从华为->外企->到互联网大厂,目前是大厂资深工程师,多次获得五星员工,多年职场经验,技术扎实,专业后端开发和后台架构设计,热爱底层技术,丰富的实战经验,分享技术的本质原理,希望帮助更多人蜕变重生,拿BAT大厂offer,培养高级工程师能力,成为技术专家,实现高薪梦想,期待你的关注!点击蓝字查看我的成长之路

校招/社招/简历/面试技巧/大厂技术栈分析/后端开发进阶/优秀开源项目/直播分享/技术视野/实战高手等, 极客星球希望成为最有技术价值星球,尽最大努力为星球的同学提供面试,跳槽,技术成长帮助!详情查看->极客星球

求点赞,在看,分享三连

算法面试|论如何4个月高效刷满 500 题并形成长期记忆相关推荐

  1. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  2. 算法面试的理想与现实

    2020-01-11 16:00:12 大型科技公司通常都主张必须进行算法面试,因为他们的规模过大,无法承受低效代码带来的巨额成本.但一次的算法面试真的能体现一个人真正的实力吗? 作者 | Dan L ...

  3. 横空出世,席卷互联网--评微软等公司数据结构+算法面试100题

    横空出世,席卷互联网                                                                          ---评微软数据结构+算法面试1 ...

  4. 横空出世,席卷互联网--评微软等公司数据结构和算法面试100题

    横空出世,席卷互联网                      ---评微软数据结构+算法面试100题 作者:July. 时间:2010年10月-11月.版权所有,侵权必究. 出处:http://bl ...

  5. 算法面试必备-----数据分析常见面试题

    算法面试必备-----数据分析常见面试题 算法面试必备-----数据分析常见面试题 1.统计学问题 问题:贝叶斯公式复述并解释应用场景 问题:朴素贝叶斯的理解 问题:参数估计 问题:极大似然估计 问题 ...

  6. [经验分享] 覃超线上直播课 如何快速搞定秋招算法面试

    本文为作者关于覃超在2020年07月12日的线上直播课的学习笔记. 再次强调 不要死磕.不要对于写的又臭又长又充满bug的代码,不停的打补丁.就算最后花费大力气通过了,也没什么进步.因为这时候已经耗干 ...

  7. 算法面试必备-----数据库与SQL面试题

    算法面试必备-----数据库与SQL面试题 算法面试必备-----数据库与SQL面试题 1.数据库理论问题 问题:什么是数据库,数据库管理系统,数据库系统,数据库管理员? 问题:什么是元组,码,候选码 ...

  8. 算法面试必备-----数据仓库常见面试题

    算法面试必备-----数据仓库常见面试题 算法面试必备-----数据仓库常见面试题 问题:什么叫数据仓库? 问题:数据仓库建模 为什么需要数据仓库建模? 数据仓库建模方法? 1.ER模型 2.维度建模 ...

  9. 剑指offer有用python版的吗_Python算法面试通关,剑指offer就靠它了

    原标题:Python算法面试通关,剑指offer就靠它了 北上广容不下肉身, 三四线放不下灵魂, 程序员里没有穷人, 有一种土豪叫算法工程师. 算法,晦涩难懂,却又是IT领域最受重视的素养之一可以说, ...

最新文章

  1. 日常生活小技巧 -- “Error: Encountered an improper argument”的解决方法
  2. 用HttpListener做web服务器,简单解析post方式过来的参数、上传的文件
  3. java里面的文件上传与下载
  4. [css] 你们团队中css的class命名采用的是什么方式呢?下划线还是横线还是驼峰?
  5. MySQL查询指定时间的数据
  6. LeetCode 201. 数字范围按位与
  7. 打印五行五列的直角三角形
  8. 谁说程序员的老婆和代码不可兼得?!
  9. 运行matlab生成多张图片后如何瞬间将图片全部关闭
  10. Java中的对象都是在堆上分配的吗?
  11. Comic Life 3 for Mac(漫画创作工具)
  12. 好用的三维绘图软件CREO学习标注尺寸
  13. Variation Model
  14. JS仿写刮刮乐小例子
  15. Java中IDEA报错 “cannot access xxx“的解决办法
  16. 【(类似DP)优化】 分梨子
  17. 393高校毕业设计选题
  18. mysql 性能优化,减轻数据库的压力。(减少数据库查询的次数)
  19. 流,对话,会话,连接等一些基本概念
  20. 部署 redis 和基本操作

热门文章

  1. php网页文字居中代码怎么写,html里文字居中代码怎么写?_WEB前端开发
  2. python两个数相加时_怎么用python让两个小数相加
  3. freemodbus源码/获取地址
  4. KDE Applications 19.04 发布,包含大量更新
  5. 解决代码中重复的捕获 promise 错误的 try catch 语句
  6. Git + Maven + Jenkins 实现自动化部署
  7. Dubbo本地开发技巧
  8. 使用subgit进行svn迁移至git(branch,tags)
  9. MyEclipse移动开发教程:移动Web模拟器指南(一)
  10. 101 Tips to MySQL Tuning and Optimization