如何科学的打开 Leetcode?
设为 “星标”,每天一起学编程!
Leetcode 对于学计算机专业的同学,就如 PhotoShop 对于学设计的同学来说,最熟悉不过了。
考虑到读者的范围比较广,先对 Leetcode 做个科普。
它是一个编程实践网站,主要注重于培养使用者的编程技巧,去解决一些巧妙的算法题。
Leetcode 官网
很久以前,还是在大学的时候,有师兄对我意味深长的说,如果把 Leetcode 上面的题目做上七遍,就有很大概率能够通过谷歌的面试。
虽然有点夸张,这句话还是对我幼小的内心,产生了不小的震撼。毕竟,在当时的我看来,谷歌和赚钱,是同义词。
在 2019 年的秋招之前,我曾经系统的刷过一段 Leetcode 算法题。平均每天做一道,坚持了有三四个月时间,从三月份到七月份。
刷题记录,一个格子表示一天,颜色越深表示做题越多
这对我的秋招面试很有帮助,拿到了基本所有一线互联网公司的 offer,没有一次是因为考察编程题吃亏的。而且,其实之前我的算法编程能力也不强。
我的方法观里,有三个重要的点,分别是:
找到科学的刷题顺序
学习优秀的解题方案
及时整理题目的套路
找到科学的刷题顺序
目前 Leetcode 收录的算题题目,超过了一千道,数量非常之多。同学们也都是很有想法的人,于是,八仙过海,各有各的姿势。
蛮力刷题法 按顺序来,一道一道的做,从 001 到 999,希望自己的编程能力愈来愈强,最终天长地久。该法对吃苦耐劳式同学最佳。
规避挫折法 Leetcode 很人性化的把题目的难度划分为:容易题,中等题,难题。为了避免刷题时候,身心受到打击摧残,只做简单题。该法对心理脆弱、亟需成就感同学最佳。
随机数法 随机生成一个题目数,然后解决这个题目,该法对探险爱好者最佳,毕竟,每一次做题,都是一次惊喜。
与上面阐述的不同,我所推荐的还是,系列学习法:在 Leetcode 上面,算法题目的类型划分的较为清楚,例如数组类、链表类、二叉树类等。刷题时,可以每次挑选一个序列的题目来做。
红框中可以看到各种题目类型
例如,我这两天先集中精力解决「链表」类题型,将与链表算法有关的变体,系统的做一遍,不断的强化脑海中与之有关的记忆细胞。
举个形象的例子,如果我去果园摘菜,东摘一颗葡萄,西摘一颗草莓,稀里糊涂的来回转悠。最终我会疲于奔走,篮子里也会杂乱不堪,还得腾出精力来进行整理。
但如果我先把成熟的葡萄都摘取了,然后再来处理草莓,就会大大节省我的整理时间和奔波消耗。
学习优秀的解题方案
刷题的时候,每遇到一道题,我都会全神贯注的思考解题思路,如果能够马上想出来,就动手编程;如果十分钟之内,都没有清晰可行的思路,我会果断的选择放弃。
我平时的工作、任务比较繁忙,不容许我花太多的时间去推敲解题策略。所以,这种方式是无奈的选择,经过实践,我发现也很高效。
需要注意的是,这里的放弃,不是真正的放弃,而是说我会去看别人的解决方案。当然,即使我做出了题目,也会去看看别人的解决方案。Leetcode 的设计机制,很容易能够让我们做到这一点。
每道题目都有一个 Discuss 讨论模块,我们点击进去,会发现,这里贴满了前人发表的各种解决方案,排名靠前的,一般是最为优秀的,或是时间和空间复杂度消耗很低,或是代码实现优美,思路清晰易懂。
一道题目的 Discuss 讨论模板
总之,阅读前几名的方案,我经常觉得是一种享受,时不时会发出赞叹「原来这题还可以这么写」。偶尔会乐在其中,也算枯燥刷题生活的苦中作乐。
及时整理题目的套路
人的记忆,是不断更新、不断遗忘的。做过的一些题目,过了一段时间,可能又还给了 Leetcode。
我很清楚自己生而为人的这种劣势,尽量用科学的方法去加以弥补。俗话说,好记性不如烂笔头,我会对刷过的题目,分门别类的进行整理总结。这个过程,是对出题人套路的深度揣摩,有利于让自己学会,透过现象看本质。
例如,以下就是我刷题过程中的整理的常见套路,虽然不够全,但对我来说够用了,你也可以整理自己的。
https://leetcode-cn.com/
至此,整理我刷题过程的所知所感,希望对大家有益,嘿嘿。
最后,再推荐几篇与 LeetCode 算法学习有关的文章给大家。
「GitHub 交流群」已开放