(转)我的2020年leetcode刷题总结

我的2020年leetcode刷题总结
学习 2021-01-01 11:346325阅读 · 595喜欢 · 44评论

魔法小分队队长
粉丝:29.2万文章:43
已关注
2020年过去了,我在leetcode上成功刷题1000+。

当然了,光追求刷题的数量是远远不够的。我如果把每道题选一个高赞答案然后ctrl+c, ctrl+v,点击提交,几天也能做到“刷题”1000+,但这就没有任何意义,别说别人了,自己都骗不了。

有人说了,我还没无聊到这样的地步,每道题代码都是自己写的。可这也是远远不够,比如50题,让你求一个数的pow(x,n),你如果直接写一个pow函数,也能在系统里"solve"这道题,但是就失去了这道题的意义。

那如何才能叫真正solve这道题?那就是

1,如果让你过一段时间,再让你重新做这道题,不给你任何提示,你还能做出来吗?

2,给你一道和这道题非常相像的姊妹题,你能顺利想到思路,解出这道题吗?

3,不给你任何编译器,让你直接在word文档里写出代码,然后你把代码copy到题目下面,点击提交,能没有任何语法错误,并且通过所有的test case吗?

4,你能顺利完成第三个要求,并且顺便向周围的朋友讲明白你的思路,所有的过程都在半小时内完成吗?(如果是在国外的话,你的英语能让外国人也听懂吗?)

以上的四个要求,一个比一个高,我目前很多medium和hard题的水平只能满足第2个,有几道hard题目甚至连第一个都做不到。而真正的算法面试,是需要满足第4个的。因此,我目前还远没有到面试的水平。当然,大家如果是刚刚刷题,不要直接要求4,否则很容易被劝退。

当然了,虽然我没有达到这么高的要求,但是刷题1000+,总归是有收获的。我的最大收获是,我不再畏惧写代码,甚至很享受它。

而且,因为经常参加周赛,我的编程水平确实有质的提升,在刷leetcode之前我虽然也会写代码,但是写出来的代码又臭又长(比如编程实现扫雷那个,现在看真是各种捂脸),而且我还以自己写了多少行为荣,完全不考虑任何的优化。

现在呢,不管是写什么样的代码,虽然不能保证一遍过,但是绝大多数时候只需要做一小点微调就可以了,不像以前,调bug的时间比写代码的时间还长。

还记得我第一次参加周赛的时候,自己费劲巴力只做出了第一题,排名在后50%,虽然比较丧气,但是我想:能做出一道题,说明我还是比那些完全不会编程的人强一点。然后后来,我就能做出一道easy难度一道medium难度的题目了。练习了300多道之后,我在某场周赛成功在最后几分钟拿下了最后一道题,那是人生第一次AK (all killed,表示全部通过)。虽然那场周赛很简单,1000多人都AK了,但是我还是很激动,毕竟人生第一次。当然,下一场比赛我就被打回原形了,印象中只做出了两道题。这也告诉我,永远不要认为你已经掌握算法,一次比赛表现好只是偶然,10次平均值才能说明问题。

现在呢,虽然我的成绩还是有起有落,在两周前的比赛还拿过1000多名(每次周赛参赛人数大约1万人),但是整体肯定是比以前好很多了,一般都至少能做出三题,时不时还能进个前200甚至前100,拿到奖励的leetcode coins。新年最后一次比赛,我的名次是156名,这让我的rating总排名进入了前1000。这是我的曲线,整体还是向上的。

我的周赛排名

说了这么多我刷题的经历,现在来分享一下我是如何做到的。

首先,大家刚拿到leetcode的时候,肯定都是踌躇满志,想着:“看我把它刷爆”。第一题,two sum,嗯嗯,简单,我一个二重循环就通过了。提交之后,丝毫没有注意到自己的时间只击败了5%的人,然后第二题......链表,这是什么玩意?放弃。然后第三题,longest substring....什么是substring?放弃。第四题一看是hard就直接跳过。之后就开始浮躁起来,觉得自己怎么这么笨,啥都不会,只会一些比如50题这样的一行代码就能过的题目(但是第50题意图肯定不是让你一行代码解决,而是考察你快速幂的知识,直接用pow过了没有任何意义),最后只做了少数的几道题。

如果你是上面的过程,不用气馁,因为一开始我就是这样的,这个时候,应该怎么做呢?

要做的是,迅速承认自己智商不足的事实。我不是高斯那样的天才,很多优美的算法,其实是数学家和计算学家研究了很长时间的,我怎么可能无师自通?要做的就是,第一次做不出来不丢人,要看别人的高赞解法。大家都是这么过来的。

比如第三题,需要用到sliding window算法,但是很多只学过数据结构,甚至只学过C语言的人,怎么可能知道sliding window?这个时候,就是要看别人的解法,看完之后自己尝试着去写。然后,通过以后,点击sliding window这个标签,会出现很多类似的题目,找一道简单难度的自己去做。按照tag刷标签是很高效的。

如果发现类似的题目还是不会刷怎么办?这也很正常,因为很多medium或者hard难度的题目需要同时用到多种方法,你要的方法,只是其中一环,而且往往还不是第一环,你无法转化成自己能解决的问题,自然就没法做。这样的题目往往是medium-hard难度。

另外,做题就一定要考虑的是时间复杂度。leetcode后期的题目,都会告诉你各个变量的取值范围,这个是非常重要的信息点,如果你题目做多了,就会发现,取值范围其实就暗示着作者想让你用什么样的算法。

N~16: 可以用指数O(2^N)的算法

N~100: 指数算法会爆炸,必须要用多项式算法。

N~500: 时间复杂度不能高于O(N^3)

N~2000: 时间复杂度不能高于O(N^2)

N~10^5: 时间复杂度不能高于O(N log N)

N~10^9: 时间复杂度必须为O(log N)或者 O(sqrt(N))

有那么一个公式,就是你的总计算次数不能超过10^7数量级,否则就会超时。这个在任何的编程竞赛中都适用。

另外,如果是多个变量,题目描述完全不变,改变变量的取值范围,就完全是不同的题目。比如数组的长度为M,每个元素取值范围是0-N,同样是分割成和相等的若干子数组,如果M很短,N很大,这可能就是一道backtrack问题,需要递归,但如果M很长,但每个元素取值只能到0-10,这就是一个背包问题,需要动态规划。所以有这么种说法,不给变量的范围就是耍流氓。

除了时间复杂度,还要看你的算法在所有方案中位置。很多人说一定要击败90%的人,其实没必要,你只要注意一下前面有没有一个高峰,并且峰值时间比你的一半还少就行。python算法不太稳定,12ms和16ms没什么区别,可能你上次提交击败50%,下次提交就95%了。

我在做题的时候,一开始我就是照抄别人的算法,一行一行理解,有些关键的代码,比如二分法的边界判定,比如union find,比如树状数组,则在理解的基础上直接背过。另外,如果长时间做不出来,则直接标记,过一个月再刷一下。

对于大家都头疼的dynamic programming,这种题目变化多样,很容易让大家怀疑自己的智商。说实话我一开始做第10题,一天都没做出来,看了代码都看不懂,后来我发现,这种DP问题,如果用递归+存储状态方法的话,能更好的理解。递归+存储状态又称记忆化搜索,我只处理现在的情况,然后下一步直接调用自身。然后还要用一个多维数组或者字典来存储状态避免重复计算(这种记忆化在bfs中应用也极为广泛)。比如下面一个例子,求某个路径和最大值类。

dp = [[0 for j in range(n)] for i in range(m)]

def getnext(a,b):

if a>=m or b>=n:     return 0    

if dp[a][b] >0:     return dp[a][b]

num1 = ...... + getnext(a+1,b)

num2 = ....... + getnext(a,b+1)

dp[a][b] = max(num1,num2)

return dp[a][b]

用这种思想,在周赛中遇到DP类题,只要不是那种只有几十个人通过的变态难题,我基本都能解出来。

另外一种是堆(heap)问题,大家一定要重视,这种算法和BFS和DFS是同等重要的,BFS的实现是队列,先进先出,DFS实现是栈,先进后出,而堆则是不管什么时候进,都是最小(最大)出。我用堆这个思想,顺利解出了一大批leetcode的难题,而且对于最小生成树,最短路径问题,天际线问题等等,用heap简直不能再爽。大家一定要练好。

用这些方法,我刷题数量越来越多,而且参加周赛真的是对你编程的一次检验,周赛积分上升真的是正反馈,如果没有周赛的话我真的很难刷的下去。所以建议大家一定要多参加几次周赛,这样让你的刷题不再单调。

通过tag训练法,再加上周赛的激励,我实现了1000+刷题,接下来有什么目标呢?再追求2000+题目也没什么意义,因为我刷的题目已经够多了,现在就是要追求质量,争取我刷过的题目,都能一遍过,没有bug,而且讲明白。

而且,是时候把重心放回到其他方面了。比如我整个冬天都没怎么更新视频,再不更新大家就该把我忘了。

最后祝大家2021年心想事成!

posted @   Algo-Goer  阅读(486)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示