来和大家聊聊我是如何刷题的(第一弹)

今天给大家聊聊怎么刷题, 预计分几篇文章来写,今天是第一篇。

话不多说,直接上干货。

我建议大家 BFS

我的做法是集中时间只刷某一类的题目。这样对某一类题目就很有心得,做题就有题感,不会做一道是一道,下次碰到类似的题,甚至原题都不会。其实很多算法都是息息相关的,等你攻克了足够多的专题之后,算法知识才能融会贯通。

我建议大家刷题的时候是广度优先,逐个突破 碰到不会的适当放弃,而不是深度优先,”死磕某一个知识“。比如大家在刷树的专题, 碰到一个树型 DP 不会, 这个时候应该果断放弃,等大家刷到 DP 的时候再回过头捡起来

听起来简单,但是我从哪个专题开始, 题目那么多我该刷哪个呢?

下面是我的 91 天刷题活动的目录:

来和大家聊聊我是如何刷题的(第一弹)_第1张图片

可以看出,我们的章节安排就是一个专题一个专题, 从简单到困难。大家也可以参考这个模式。如果你实在不知道。

刷题路线可以从网上找,你如果懒得找,而且也不嫌弃在下的话,可以参考我的 leetcode 题解仓库,把里面的题目刷下,或者参加我的 91 天学算法。

BFS 就是在必要的时候不求甚解。比如,我在 穿上衣服我就不认识你了?来聊聊最长上升子序列 中提取了很多 LIS(最长上升子序列)题目。很多人评论说”这效率不行,不如贪心啊!“。

这点我承认。但是我这里的主要目的是给大家横向对比题目,做到多题同解

大家想看效率高的,其实也不难。 LIS 也可以用 贪心 + 二分 达到不错的效率。代码如下:

来和大家聊聊我是如何刷题的(第一弹)_第2张图片

代码文字版如下:

class Solution:
    def lengthOfLIS(self, A: List[int]) -> int:
        d = []
        for a in A:
            i = bisect.bisect_left(d, a)
            if i < len(d):
                d[i] = a
            elif not d or d[-1] < a:
                d.append(a)
        return len(d)

所以我的意思是,大家在适当的时候要不求甚解,不去追求这些东西。等大家把一个套路学的差不多,咱再学下一个。所谓君子报仇,十年不晚 ^\_^

另外插一句题外话, LIS 真的很有用,大家一定要掌握,掌握了平方的解法再去看看 $NlogN$ 的解法,一些 HARD 题目必须要 $NlogN$ 才能过。

比如这道题:

来和大家聊聊我是如何刷题的(第一弹)_第3张图片

题目后的提示如下:

3 <= nums.length <= 1000
1 <= nums[i] <= 109
题目保证 nums 删除一些元素后一定能得到山形数组。

看到这些,大概估算我们的时间复杂度 $N^2logN$,基本过是没问题的,果然就过了。

来和大家聊聊我是如何刷题的(第一弹)_第4张图片

再次印证了,刷题的多少是次要的,吃透一类题才是王道,这其实就和我的BFS 刷题大法相呼应。

套路很重要

以上的这些,其实都是帮助大家识别套路,提高刷题效率的。知道了广度优先,也知道了刷什么题也是不够的。比如:

  • 这些专题有哪些考点?如何应对?
  • 有模板么?
  • 我如何想到用这种解法?
  • 等等

针对这些问题,我写了很多文章给大家。比如前面一段时间,我给大家写了两篇专题:

大家的反响大部分都是不错的。

在之前, 我还写了几篇解套篇,就是将力扣相同解法的题目汇总起来,帮助大家解套,比如:

甚至还写了母题系列(不过大家不太喜欢,就没继续更新了):

你认真看完我写的,基本上覆盖了专题下的大部分考点。

你接下来想看啥? 欢迎去我的刷题群告诉我(关注公众号《力扣加加》回复 leetcode 根据提示操作即可)。

掌握多个编程语言

刷题以及打比赛都讲究速度,天下武功唯快不破。

这个快,一方面是运行速度快,另一方面是编码速度快。你可以看出很多人刷题,打比赛都会不断切换语言的。我们要承认不同语言效率是不一样的,这个效率可能是执行,也可能是编码。具体使用哪种语言,看你的需求。

论编码速度,那肯定动态语言快,论执行速度那肯定静态语言快。 所以我的建议是大家至少掌握一静一动,即掌握一个动态语言,一个静态语言。

我个人动态语言用的 Python 和 JS,静态语言用的 Java 和 CPP,大家可以作为参考。

一个小建议是你选择的语言要是题解比较热门的。那什么语言是热门的?其实很容易。力扣题解区,语言排名高的基本就是了,如下图:

来和大家聊聊我是如何刷题的(第一弹)_第5张图片

掌握语言不仅能帮助你在效率中运用自如,并且还容易看懂别人的题解。除此之外还有一个用,那就是回头复习的时候用。拿我来说, 我会不固定回去刷以前做过的题,但是一道题做过了就没新鲜感了,这个时候我就换个语言继续刷,又是一番滋味。

使用模拟面试

这个技巧,我之前提到过。力扣也有模拟面试的功能,大家也可以线下真人白板面试。不管如何,建议大家一定要有时间观念和一次 AC 的标准

使用模板

很多题目都是模板题。你如我在 二分法专题 就给大家总结了无数的模板,其实还有很多专题都有,大家去我的历史文章翻翻就有。

但是大家一定理解之后再去用模板。 不要没理解直接套,这是不好的。

更多技巧,期待下次。

预告

最后最后给大家一个小道消息,和上面的解题模板有关。

接下来,力扣加加的刷题插件计划推出刷题模板功能

  • 给大家提供多种刷题模板,可以直接复制使用。
  • 各个模板都有都有的题目,大家可以直达题目进行”默写“。
  • 更多功能,等你来提~

你可能感兴趣的:(算法,数据结构和算法,leetcode,数据结构)