大家好,我是负雪明烛,今天我打算讲一讲我刷 LeetCode 的一些经验。

我是在大二的时候接触的 LeetCode 英文版,我当时刚上完「算法与数据结构」这门课。我本来打算每天做 LeetCode 的一个题,但是刷了 10 来个 Easy 题之后,由于觉得题目太难没坚持下去。后来,在大四考研后和研一研二的两年左右的时间,我刷了 800 多道题。那么我是怎么做到的呢?

image.png

我打算分为两个部分来讲:入门篇、提高篇。

一、入门篇

刚开刷 LeetCode 时遇到翻转二叉树题目,我在纸上画图进行思考,想了一天也没明白,当时无比痛苦。因为我的方法不对,我总想着自己在脑子里面想明白再写,还想着用本地IDE写个二叉树结构进行debug,现在看来都是走了弯路。

对于新人而言,不应该自己硬扣一个题目,如果想了一会没有任何思路,就应该果断看别人怎么写的。在理解了别人的做法之后,再凭理解和记忆在LeetCode的代码框里敲一遍。

就像每个课本都会有例题一样,只学纯知识大家都不知道怎么运用的。而我们在刷LeetCode的时候并没有例题可以给我们学习,因此新手会感到痛苦。新手不要害怕看别人的解法和答案,度过痛苦时期,后面就会越刷越快。

新手应该注重三个方面:基础知识、跟别人学习、做好笔记 。

1. 基础知识

需要掌握常用的数据结构和算法的思想和适用场景。

我推荐《算法第4版》,看这个书的时候不用全部看,只看重点,比如前面的Java知识不用看,数学推导不用看。再推荐一本侯捷的《STL源码剖析》,这本书对理解C++ STL有重大帮助,看了之后绝对会对数据结构和算法有更深的理解,我看完这本书之后感觉相见恨晚啊。

2. 跟别人学习

向别人学习是非常必要的。

又分为两种:

1)看别人的题解

主要看别人在解决这个题目的思路是什么。

推荐的题解作者有:

花花酱:基本每个题都有博客和视频,强烈推荐看他的视频。
负雪明烛:把重点放在分析上,每篇质量都很高。
Grandyang:通过举例子来让你明白该怎么做。
李威威甜姨柳婼书影博客

题解区的答案:英文版看lee215,中文版看liweiwei和sweetie,以及官方解答。

如果你会做这个题目,我也觉得应该看下别人怎么解决的,思路是不是一样。

比如想看负雪明烛的two sum题解,那么搜索方式就是加上fuxuemingzhu在后面搜:

经验分享:LeetCode 应该怎么刷? - 图2

2)看别人的总结

这部分包括算法讲解、套路整理、刷题模板等。

负雪明烛说:”做题 = 想法 + 模板“,想法需要通过看别人的解答以及讲解获得,模板就是做题的套路和模板,既可以自己总结,也可以看别人总结好的。

首先是labuladong的算法小抄,在Github上两周就获得了 10k star!!!强烈推荐,特别是动态规划不懂的,可以看。

然后有负雪明烛的【LeetCode】代码模板,刷题必会,基本总结了所有的做题模板。

3. 做好笔记

在很多年前我就开始把每个做过的题目记录在CSDN上,现在我的博客浏览量已经将近100万了。

经验分享:LeetCode 应该怎么刷? - 图3
我的做法是:任何题,无论难度,我都进行记录题目、想法、代码。虽然经常写博客的时间比写题的时间还多,但是把自己的想法讲解一遍才是真的懂了,更方便了自己之后看、以及大家交流。

当然,除了写题解,还要整理做题的方法、套路、模板,这些会随着你的经验慢慢形成的。

在B站有个小姐姐演示了如何用iPad做笔记,也讲了小白如何上手LeetCode,值得一看。

[video(video-6wQDzor1-1585478908694)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=83149746)(image-https://ss.csdn.net/p?http://i0.hdslb.com/bfs/archive/324def3d40a711a9cb4ab8f53f99dcdba0183200.jpg)(title-程序媛分享 | LeetCode小白如何上手刷题?iPad学习方法 | 刷题清单 | 新手指南 | 刷题找工作 | IT类)]

4. 交流和监督

刷题最大的障碍是自己。特别是新手,很可能由于刚接触LeetCode感觉太难就没有毅力坚持下去,导致半途而废。而且,刷题更重要的是坚持,做题的感觉都需要手感进行保持的。

所以,如果能有个组织交流和监督就好了。

我组织了”每日一题交流群“的活动,并且做了个网站https://ojeveryday.com来监督大家打卡。群的规则是每天发题和打卡,如果一周没有参加的话就会被踢出群(如果有更好的监督方式请告诉我)。

经验分享:LeetCode 应该怎么刷? - 图4

事实证明这种大家一起做同一道题目,并且一起交流讨论的氛围非常好。更多规则可以看下面的文章,我的联系方式在网站的首页。

负雪明烛:助力每日一题!每日一题打卡网站上线!

二、提高篇

如果你已经过了小白的阶段,那么应该做些提高项目。

1. 周赛

所谓周赛,就是每周日上午,LeetCode组织的一场比赛,总共4道题,一般是Easy一道,Medium两道,Hard一道。中英文网站同时开始,题目相同。

做周赛的目的是检验我们的学习成果,毕竟这些题目都是新的,就像考试一样。

不要担心自己做不出来,只要尽力而为就好了,我一般的目标是解决前三道,第4道Hard做不出来也没有心理负担。

参加完比赛之后,看下别人的解答,因为都是自己苦思冥想过的方法,因此可以提高地特别快。

我最好的周赛成绩是全球28名,当时非常兴奋,开心了一整天。

2. 总结与分享

这一点和入门篇的做好笔记 略有重复,但是仍然要说,因为如果只是单纯的记录笔记和写每个题目的记录是不够的。

我在写博客的时候就落入了只记录不总结的误区中,单个题目的解决方案只会有正在做这个题的人看,但是你的提炼总结可以让你和大家都获得成长,这也是我写这个回答的原因。

上文中提到的labuladong的算法小抄就是个很好的总结与分享例子。

最后,希望大家都能够通过刷LeetCode获得成长,拿到自己满意的Offer。

期待你的点赞、关注、分享。