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

脑洞前端

共 938字,需浏览 2分钟

 ·

2020-12-03 11:24

点击蓝色“力扣加加”关注我哟

加个“星标”,带你揭开算法的神秘面纱!


这是力扣加加第「29」篇原创文章

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

话不多说,直接上干货。

我建议大家 BFS

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

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

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

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

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

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

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

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

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

代码文字版如下:

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 真的很有用,大家一定要掌握,掌握了平方的解法再去看看  的解法,一些 HARD 题目必须要  才能过。

比如这道题:

题目后的提示如下:

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

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

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

套路很重要

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

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

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

  • 几乎刷完了力扣所有的树题,我发现了这些东西[4]
  • 几乎刷完了力扣所有的链表题,我发现了这些东西[5]

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

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

  • 穿上衣服我就不认识你了?来聊聊最长上升子序列[6]
  • 你的衣服我扒了 - 《最长公共子序列》[7]

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

  • 《我是你的妈妈呀》 - 第一期[8]

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

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

掌握多个编程语言

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

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

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

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

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

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

使用模拟面试

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

使用模板

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

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

更多技巧,期待下次。

预告

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

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

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

Reference

[1] 

91 天刷题活动: https://lucifer.ren/blog/2020/10/19/91-algo-2/

[2] 

leetcode 题解仓库: https://github.com/azl397985856/leetcode

[3] 

穿上衣服我就不认识你了?来聊聊最长上升子序列: https://lucifer.ren/blog/2020/06/20/LIS/

[4] 

几乎刷完了力扣所有的树题,我发现了这些东西: https://lucifer.ren/blog/2020/11/23/tree/

[5] 

几乎刷完了力扣所有的链表题,我发现了这些东西: https://lucifer.ren/blog/2020/11/08/linked-list/

[6] 

穿上衣服我就不认识你了?来聊聊最长上升子序列: https://lucifer.ren/blog/2020/06/20/LIS/

[7] 

你的衣服我扒了 - 《最长公共子序列》: https://lucifer.ren/blog/2020/07/01/LCS/

[8] 

《我是你的妈妈呀》 - 第一期: https://lucifer.ren/blog/2020/08/03/mother-01/

[9] 

二分法专题: https://github.com/azl397985856/leetcode/blob/master/91/binary-search.md

浏览 48
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报