文章目录

引言

本人非计算机专业出身,本科期间一直觉得数据结构与算法是一项非常基础也重要的知识,但是由于自己可有可无的欲望和糟糕的自律能力,并没有深入地学习这项知识技能。但是,随着时间的流逝,无论在工作中、网络中还是朋友圈中,发现数据结构与算法是无比的重要,以至于任何一位牛人都无不逆天地掌握这项最基本的本领。所以,在2018年8月份,我下定决心通过刷LeetCode来锻炼这一本领——数据结构与算法。

从那时起,几乎是从0起步,很多知识都不了解,基本上每刷几道题都会卡到一个完全没有遇到过的知识点,尽管到现在也会时不时地发生。但是,我一直都在坚持,并且从未放弃,累计现在已经刷了421道题目(其实不止)。你也许会问这是为什么,当然,我会在文中的后面讲到。不过,在此之前,我不得不提我是怎么计划并走过这次还未完成的刷题之旅的——到底该如何刷LeetCode?

步骤

频率优先 —— 因人而异的刷题顺序

最开始的前两个月,我基本上是按照题目的序号来刷。接着,我发现我基本上每天都会使用LeetCode,索性购买了LeetCode的年度会员,价格为159美元,差不多1100多人民币。其实,这个价格满贵的,但是考虑到知识是无价的,就下定决心订阅了会员。

关于会员,我的建议是可以购买中国区的LeetCode会员,这个价位一年仅人民币499元。其次,还要看性价比,如果你真的并不是几乎每天都使用LeetCode的话,那么可以考虑月度会员,甚至不要购买。

话说回来,在购买会员之后,我采用了频率的方式进行刷题。这么做有以下两个原因:

到底该如何刷LeetCode - 频率排序
到底该如何刷LeetCode – 频率排序
  • 优先刷高质量(高频率)的题目
  • 给自己足够的思考时间,不断地总结每种类型的题目的共性或区别,加深理解

当然,有人会提倡按照分类来刷题。我是这样认为,分类来说可以在短期的学习效率上更为高效,因为专题的训练可以让自己在短时间内加深对某一个类型的熟悉程度。但是,如果时间是比较充裕的话,我觉得可以按照频率由高到低进行刷题,这样保证每种类型的题目交叉地进行训练。致使我们不得不在不同地题型中来回的切换思路,能够更深入地理解题目的共性与区别。

谷歌+视频 —— 寻求答案

当然,在刷题时难免会遇到完全不知道的知识点,甚至看了大佬的答案(Solution)之后还是一知半解。这时,以我的经验可以首先去谷歌(Google)搜索一下题目的对应的知识点,比如说题目——Optimize Water Distribution in a Village 的考察点是最小生成树(MST),那么可以通过谷歌收到相应地文献资料。这里推荐两个来源:

以上题为例,可以查阅这两篇文章:

如果还是看得不明白,那么可以到YouTube或者B站搜索下相关的视频讲解。推荐一个讲解的非常好的Up主——花花酱

同时,我在学习的过程中,也成立了自己的LeetCode系列的频道。

到底该如何刷LeetCode - 小旭讲解
到底该如何刷LeetCode – 小旭讲解

基本上,通过文献的阅读以及手把手地视频讲解,凭借着我们聪明的小脑瓜都可以迎刃而解了。

但是,总是有一些题目我们无法理解的。比如,以我目前的水平去解决Codeforces上面的某些超难的题目时,尽管我查阅了所有的资料,无论是文章还是视频,都无法理解。这种情况下,我觉得是自身的水平和题目要求的标准差距是巨大的,所以目前的决策就是——“放弃”。但这并不能于真正的放弃,而是先修炼内功,打好基础,慢慢地学习高阶的内容,当能力慢慢达到的时候,自然就会快速的学会之前怎么也看不懂的题目了。

思考归类 —— 形成自我的知识体系

在刷题的过程中更为重要的是,要不断地停下来思考与归类总结。即不断地总结学过的知识,找出其共性与区别,由点到面地梳理成自我的知识体系,形成一种模式(Pattern)。

  • 输入
    • 刷题 —— 发现新的知识点
    • 总结思考,形成知识体系
  • 输出
    • 参加竞赛——验证水平(比赛名次)

我把学习的过程分成了两大模块,输入与输出。我们看到,输入有刷题和总结两块,其最终都是提升自我的固有知识。在输出方面,列举了参加竞赛,是为了验证我们的能力水平。所以,切记不要混淆了这里的输入与输出。误把输出当成了输入,一味地刷同样的知识点的题目,却总也不思考与总结。

刻意练习 —— 高效的学习方法

在这里,我提及一种成功的学习方法。这种方法我也在一直使用——刻意练习。这种方法分成三个步骤:

  • 梳理知识网络,拆解知识点
  • 深入练习每一个要点
  • 实时反馈

首先,我们要梳理需要学习的内容,至少有一个整体的知识框架。这个框架可以通过阅读权威性的材料、文章,也可以通过自身不断的学习总结得来。

其次,针对每一项知识点,进行专项练习,加强加深对每一个知识点的理解。

最后,通过与别人的交流沟通,及时找到未发现的问题,进行反复地练习。

可以看出,通过上面提到的学习步骤——按照频率刷题,找到新的知识点,思考归类,我们可以慢慢地梳理成知识网络。然后,不定期的做一些专项的训练,比如AcWing不定期的活动——2019暑期LeetCode打卡,来深入每一个知识点,加强对每一个知识点的理解。最后,在不断地发现问题,解决问题,形成闭环。

学习资源

除了上面提到的视频UP主与文献网站之外,目前我在看的,并且觉得非常实用的书籍是——《算法竞赛进阶指南》。

这本书由一位北大毕业的大佬——李煜东所著。从作者的履历来看,有着丰富的竞赛经验,如ACM ICPC2015亚洲区域赛冠军、入选世界总决赛。从书中的内容来看,是一本侧重进阶类的书籍。

基本上,每一次遇到的新知识点都可以在书中找到答案。更重要的是,书中的语言简洁明了、讲述得清晰到位,同时还有着丰富的代码示例与例题。所以,我非常愿意推荐这本书给正在刷题或者学习的朋友们。相信,你一定能在这本书中受益无穷。

为什么我坚持不下来?

很多人都有这样的苦恼,在之前的时间里,这也是我的一大难题。但是如今,我却完完全全地甩开了这一个让人无比愧疚的魔鬼——懒惰。

对,是懒惰让我们坚持不下来。所以问题就变成了如何克服懒惰?在解答这个问题之前,我想分享一句话——一个人能否做成一件事,不在于有没有能力完成这件事,而是在于对这件事到底有多大的渴望!!!

我想,也许你已经悟道了答案——树立自己的梦想。

唯有强大的梦想才是克服懒惰走向胜利的精神支柱,如果你的梦想足够的强大,如果你对梦想有足够的“贪婪”,那么你不可能坚持不下来,不可能在每天的自责与愧疚中度过,你一定会在没有闹钟的情况下的5:30醒来,并果断地起身学习,你一定会在没有任何人催促的情况下,雷打不动地坚持学习。

所以,答案就是建立自己强大的梦想。如果你不知道该如何树立自己的强大的梦想,也许这个UP主会帮到你——清华生保持高效率奋斗的五大因素 | 梦想如何让你的人生充满意义

总结

相信通过上面的分享,能够给广大的学习的朋友带来一定的思考与建议。我们每一个人都有同样的时间,但是却在成就着不一样的成绩。我相信,如果你梳理了正确的学习计划与方法,同时树立了强大的梦想,那么你自然就会得到这样的一个答案——到底该如何刷LeetCode?

最后,以文中的一句话结尾,与君共勉—— 一个人能否做成一件事,不在于有没有能力完成这件事,而是在于对这件事到底有多大的渴望 。

胡小旭
2019年11月17日 于北京

Share:

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.