关于算法:来和大家聊聊我是如何刷题的第一弹

59次阅读

共计 2098 个字符,预计需要花费 6 分钟才能阅读完成。

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

话不多说,间接上干货。

我倡议大家 BFS

我的做法是集中工夫只刷某一类的题目。这样对某一类题目就很有心得,做题就有题感,不会 做一道是一道,下次碰到相似的题,甚至原题都不会。其实很多算法都是非亲非故的,等你攻克了足够多的专题之后,算法常识能力死记硬背。

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

听起来简略,然而我从哪个专题开始,题目那么多我该刷哪个呢?

上面是我的 91 天刷题流动的目录:

能够看出,咱们的章节安顿就是一个专题一个专题,从简略到艰难。大家也能够参考这个模式。如果你切实不晓得。

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

BFS 就是在必要的时候不求甚解。比方,我在 穿上衣服我就不意识你了?来聊聊最长回升子序列 中提取了很多 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 真的很有用,大家肯定要把握,把握了平方的解法再去看看 $NlogN$ 的解法,一些 HARD 题目必须要 $NlogN$ 能力过。

比方这道题:

题目后的提醒如下:

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

看到这些,大略估算咱们的工夫复杂度 $N^2logN$,根本过是没问题的,果然就过了。

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

套路很重要

以上的这些,其实都是帮忙大家辨认套路,进步刷题效率的。晓得了广度优先,也晓得了刷什么题也是不够的。比方:

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

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

  • 简直刷完了力扣所有的树题,我发现了这些货色
  • 简直刷完了力扣所有的链表题,我发现了这些货色

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

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

  • 穿上衣服我就不意识你了?来聊聊最长回升子序列
  • 你的衣服我扒了 –《最长公共子序列》

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

  • 《我是你的妈妈呀》– 第一期

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

你接下来想看啥?欢送去我的刷题群通知我(关注公众号《力扣加加》回复 leetcode 依据提醒操作即可)。

把握多个编程语言

刷题以及打较量都考究速度,天下文治唯快不破。

这个快,一方面是 运行速度快 ,另一方面是 编码速度快。你能够看出很多人刷题,打较量都会一直切换语言的。咱们要抵赖不同语言效率是不一样的,这个效率可能是执行,也可能是编码。具体应用哪种语言,看你的需要。

论编码速度,那必定动静语言快,论执行速度那必定动态语言快。所以我的倡议是大家至多把握 一静一动,即把握一个动静语言,一个动态语言。

我集体动静语言用的 Python 和 JS,动态语言用的 Java 和 CPP,大家能够作为参考。

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

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

应用模仿面试

这个技巧,我之前提到过。力扣也有模仿面试的性能,大家也能够线下真人白板面试。不论如何,倡议大家肯定要有 工夫观点和一次 AC 的规范

应用模板

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

然而大家 肯定了解之后再去用模板。不要没了解间接套,这是不好的。

更多技巧,期待下次。

预报

最初最初给大家一个小道消息,和下面的解题模板无关。

接下来,力扣加加的刷题插件打算推出 刷题模板性能

  • 给大家提供多种刷题模板,能够间接复制应用。
  • 各个模板都有都有的题目,大家能够中转题目进行”默写“。
  • 更多功能,等你来提~

正文完
 0