今天给大家聊聊怎么刷题, 预计分几篇文章来写,今天是第一篇。
话不多说,直接上干货。
我建议大家 BFS
我的做法是集中时间只刷某一类的题目。这样对某一类题目就很有心得,做题就有题感,不会做一道是一道,下次碰到类似的题,甚至原题都不会。其实很多算法都是息息相关的,等你攻克了足够多的专题之后,算法知识才能融会贯通。
我建议大家刷题的时候是广度优先,逐个突破 碰到不会的适当放弃,而不是深度优先,”死磕某一个知识“。比如大家在刷树的专题, 碰到一个树型 DP 不会, 这个时候应该果断放弃,等大家刷到 DP 的时候再回过头捡起来。
听起来简单,但是我从哪个专题开始, 题目那么多我该刷哪个呢?
下面是我的 91 天刷题活动的目录:
可以看出,我们的章节安排就是一个专题一个专题, 从简单到困难。大家也可以参考这个模式。如果你实在不知道。
刷题路线可以从网上找,你如果懒得找,而且也不嫌弃在下的话,可以参考我的 leetcode 题解仓库,把里面的题目刷下,或者参加我的 91 天学算法。
BFS 就是在必要的时候不求甚解。比如,我在 穿上衣服我就不认识你了?来聊聊最长上升子序列 中提取了很多 LIS(最长上升子序列)题目。很多人评论说”这效率不行,不如贪心啊!“。
这点我承认。但是我这里的主要目的是给大家横向对比题目,做到多题同解。
大家想看效率高的,其实也不难。 LIS 也可以用 贪心 + 二分 达到不错的效率。代码如下:
代码文字版如下:
1 | class Solution: |
所以我的意思是,大家在适当的时候要不求甚解,不去追求这些东西。等大家把一个套路学的差不多,咱再学下一个。所谓君子报仇,十年不晚 ^_^
另外插一句题外话, LIS 真的很有用,大家一定要掌握,掌握了平方的解法再去看看 $NlogN$ 的解法,一些 HARD 题目必须要 $NlogN$ 才能过。
比如这道题:
题目后的提示如下:
1 | 3 <= nums.length <= 1000 |
看到这些,大概估算我们的时间复杂度 $N^2logN$,基本过是没问题的,果然就过了。
再次印证了,刷题的多少是次要的,吃透一类题才是王道,这其实就和我的BFS 刷题大法相呼应。
套路很重要
以上的这些,其实都是帮助大家识别套路,提高刷题效率的。知道了广度优先,也知道了刷什么题也是不够的。比如:
- 这些专题有哪些考点?如何应对?
- 有模板么?
- 我如何想到用这种解法?
- 等等
针对这些问题,我写了很多文章给大家。比如前面一段时间,我给大家写了两篇专题:
大家的反响大部分都是不错的。
在之前, 我还写了几篇解套篇,就是将力扣相同解法的题目汇总起来,帮助大家解套,比如:
甚至还写了母题系列(不过大家不太喜欢,就没继续更新了):
你认真看完我写的,基本上覆盖了专题下的大部分考点。
你接下来想看啥? 欢迎去我的刷题群告诉我(关注公众号《力扣加加》回复 leetcode 根据提示操作即可)。
掌握多个编程语言
刷题以及打比赛都讲究速度,天下武功唯快不破。
这个快,一方面是运行速度快,另一方面是编码速度快。你可以看出很多人刷题,打比赛都会不断切换语言的。我们要承认不同语言效率是不一样的,这个效率可能是执行,也可能是编码。具体使用哪种语言,看你的需求。
论编码速度,那肯定动态语言快,论执行速度那肯定静态语言快。 所以我的建议是大家至少掌握一静一动,即掌握一个动态语言,一个静态语言。
我个人动态语言用的 Python 和 JS,静态语言用的 Java 和 CPP,大家可以作为参考。
一个小建议是你选择的语言要是题解比较热门的。那什么语言是热门的?其实很容易。力扣题解区,语言排名高的基本就是了,如下图:
掌握语言不仅能帮助你在效率中运用自如,并且还容易看懂别人的题解。除此之外还有一个用,那就是回头复习的时候用。拿我来说, 我会不固定回去刷以前做过的题,但是一道题做过了就没新鲜感了,这个时候我就换个语言继续刷,又是一番滋味。
使用模拟面试
这个技巧,我之前提到过。力扣也有模拟面试的功能,大家也可以线下真人白板面试。不管如何,建议大家一定要有时间观念和一次 AC 的标准。
使用模板
很多题目都是模板题。你如我在 二分法专题 就给大家总结了无数的模板,其实还有很多专题都有,大家去我的历史文章翻翻就有。
但是大家一定理解之后再去用模板。 不要没理解直接套,这是不好的。
更多技巧,期待下次。
预告
最后最后给大家一个小道消息,和上面的解题模板有关。
接下来,力扣加加的刷题插件计划推出刷题模板功能。
- 给大家提供多种刷题模板,可以直接复制使用。
- 各个模板都有都有的题目,大家可以直达题目进行”默写“。
- 更多功能,等你来提~