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

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

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

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

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

话不多说,直接上干货。

我建议大家 BFS

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

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

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

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

daa9d93413c9d2f0ad8f73af0feab842.png

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

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

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

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

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

90d10afba9b82b707c8bdaa79c027e8a.png

代码文字版如下:

class Solution:

def lengthOfLIS(self, A: List[int]) -> int:

d = []

for a in A:

i = bisect.bisect_left(d, a)

if i 

d[i] = a

elif not d or d[-1] 

d.append(a)

return len(d)

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

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

比如这道题:

09c329f2b6a54090ae64c8651e35db2a.png

题目后的提示如下:

3 <= nums.length <= 1000

1 <= nums[i] <= 109

题目保证 nums 删除一些元素后一定能得到山形数组。

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

2fae8d2e7fdc50d9193d2bda3690dc07.png

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

套路很重要

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

这些专题有哪些考点?如何应对?

有模板么?

我如何想到用这种解法?

等等

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

几乎刷完了力扣所有的树题,我发现了这些东西

[4]

几乎刷完了力扣所有的链表题,我发现了这些东西

[5]

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

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

穿上衣服我就不认识你了?来聊聊最长上升子序列

[6]

你的衣服我扒了 - 《最长公共子序列》

[7]

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

《我是你的妈妈呀》 - 第一期

[8]

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

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

掌握多个编程语言

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

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

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

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

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

33e604ac44f7e5c916f706470340ab49.png

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

使用模拟面试

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值