首页 > 寺庙

我的年leetcode刷题总结|

我的年leetcode刷题总结

2020年过去了,我在leetcode上成功刷题1000+。

我的年leetcode刷题总结|

当然了,光追求刷题的数量是远远不够的。我如果把每道题选一个高赞答案然后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,比如树状数组,则在理解的基础上直接背过。另外,如果长时间做不出来,则直接标记,过一个月再刷一下。

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年心想事成!

电影总结 年我最喜欢的十部电影

2018年马上就要过去了,回望2018年,好片烂片都看了不少,今天,我挑选了十部自己喜欢的电影,不知道有没有小伙伴喜欢了,欢迎大家来吐槽。

第一部:《红海行动》

《红海行动》超过预期,非常令人兴奋,最近的几场战斗,血肉之躯,估计近年来已成为中国语言的主题。电影结尾没有强制主题,也没有个人英雄主义的颜色。整部电影是一项紧凑而艰巨的任务。山地,沙漠,空降地形和战斗任务几乎都涉及,狙击和救援。这部分非常令人兴奋,结局也非常强大。

第二部:《复仇者联盟3:无限战争》

我一直以为我是漫威的过路人,但在看了《复联3》之后,我意识到漫威最强大的地方就是默默地将每个角色写进你的心里,我的眼里充满了泪水。真的不要被宠坏,所以你会多次滥用你的心,因为你不知道它是谁。

第三部:《我不是药神》

从戏剧摄影到导演的技巧,这是典型的电影学校风格,但拥有一个看起来像原始福利安的团队是非常有趣的。徐渭和王传军一般都横扫各种表演奖。对这部电影进行评论并不容易。有些戏剧是合理的,具体的直接和意识形态问题并不是那么苛刻。如果你仔细想想,为这部电影吹嘘是值得的。

第四部:《西虹市首富》

作为一部商业电影,它非常精明且易于制作。一方面,尽力取悦公众,包括卡路里的歌声,颤音的传播可以反映出来球队的作战能力。另一方面,对中国社会的现实有很多借鉴和讽刺,有些仍然是巧妙的。

第五部:《头号玩家》

电影彩蛋令人眼花缭乱,有视频,动画,电影,科幻小说,电子音乐视听盛宴,想象力,爆炸声,总有惊喜随时想要尖叫。电影在现实与游戏之间传播。它就像一个万花筒,一个宏伟的主题公园和一个色彩缤纷的博物馆。

第六部:《无双》

《无双》这是一部带有智商的电影。我很久没见过这么漂亮的香港电影了。庄文强回归了他擅长的曲折。郭富城扮演的角色非常具有颠覆性。这在中国电影中很少见,而且非常精致和隐蔽。

第七部:《碟中谍6:全面瓦解》

碟中谍6中跳高低,摩托车追逐,直升机大战,自由攀登,都是实拍!汤是56岁,看起来老了点,但依然很拼,挺喜欢

第八部:《摩天营救》

强森真的是好莱坞奥林匹克精神的代言人,血槽,耐力,力量和智力都是MAX,电影场面惊险刺激。

第九部:《超时空同居》

我今年见过的最流畅的商业爱情喜剧。我从未见过大屏幕和美丽漂亮的女人,她尖叫着“最年长的女人是最美丽的”,真是一种真实的生命力。雷家印哭着笑了起来。在选择面包或爱情的框架下,时空的设置特别引人注目,两者太闪亮,细节也很扎实。爱就像你改变生活一样甜蜜。

第十部:《巨齿鲨》

一部电影让灾难迷们无法拒绝,整个过程都是紧张的,恐怖的气氛非常好。虽然情节是常规的,但没有漏洞。 Jason Statham和李冰冰的组合不错,小女孩的演技绝对是一个亮点,特效,给予满分。


|我的年leetcode刷题总结

  

我的年leetcode刷题总结|
  • 年最好的十部电影 都在这|
  • 年最好的十部电影 都在这| | 年最好的十部电影 都在这| ...

    我的年leetcode刷题总结|
  • 我最喜欢的部电影|
  • 我最喜欢的部电影| | 我最喜欢的部电影| ...

    我的年leetcode刷题总结|
  • 我的年|
  • 我的年| | 我的年| ...