如何科学的刷 LeetCode ?
算法很重要,但算法也是学起来最难,最令人生畏的。
特别是刷 LeetCode 的时候!!!
很多初学者在刷题的时候,思路飞来飞去,有时候以为是 动态规划 的知识点,结果写了半天代码越写越乱,最后一看 discuss 原来可以用 栈 来解决。
其实,学算法,刷题蛮干是不行的,需要遵循科学的方法。
盲目花大量时间刷题,不如背一遍北大学霸的算法刷题模板!这里我推荐大家都去听一下由北大ACM金牌大神的《九章算法课》,注册同时回复【吴师兄】还能免费领取LeetCode小抄模板,链接我放下面了。
以下的经验技巧,对于算法新手,或大学没有搞过ACM,想利用业余时间提升算法能力的同学比较有帮助,对于算法高手和ACM大牛,可能不太适用,仅供参考。
算法不是拼智商
算法不是纯粹拼智商的,智商高,就一定很厉害,不够聪明,就一定不行。算法是一种技能,是可以通过科学合理的方式训练出来的能力。
智商的高低,当然会有影响,但这个先天因素无法改变,而科学合理的方法是大家都可以掌握的。
所以,首要的一点,是要意识到,算法不是只拼智商的,也是可以经由后天训练习得的。
难度要循序渐进
有些同学喜欢上来就是干,上来就是终极难度的题目,觉得自己只要做出最难的,其它的就迎刃而解了。这种急于求成的思想要不得。
算法训练是一个系统工程,需要循序渐进,太过于急功近利,反而容易因做不出难题而产生挫败感,带来反效果。
记得我有一个同事就做了次类似的事情。我们当时刚听说有leetcode,就想上去试试,他上去后就挑了一道困难里面还属于比较难的题目,结果想了大半天也没做出来,搞到自己特别沮丧。
你会发现这种做法效率很低,那道题目就算被做出来了,也不代表就可以解出其它的题目。
合理的做法是循序渐进。
如果你本身有基础,熟练度高,那你刷简单的leetcode应该是几分钟一题,几分钟一题的,花不了你多少时间。
如果你刷简单都花费很长时间,说明熟练度不够,就更应该从简单开始。
然后过度到中等,再过度到困难。
这里有个经验之谈。
目前国内大厂的算法考察,基本不会超过leetcode 中等难度,上限难度基本都是leetcode 中等题里面的中等难度(有点拗口,leetcode 中等难度里面也有分档次)。
如果你能够再20分钟内,做出这种难度的题目,国内大厂的算法面试,基本可以畅通无阻。
按算法分类来选题
选择题目,除了在难度上要循序渐进,还建议在算法上进行划分。
基本的算法数据结构是有限的。比如说链表,二叉树,二分查找,动态规划,哈希表。。。
我喜欢按算法的分类来选题和刷题,比如一个时间段,只刷链表题,待刷得差不多的时候,接下来再刷二叉树的题。。。
这种做法可以极大的提高刷题的速度,而且能带来更好的效果。
一,持续地刷同个类型的题目,可以不断地巩固和加深理解。
二,可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。
所以在一段时间内,持续地刷特定类别的题目,可以带来事半功倍的效果。
当然,在能力已经比较强的时候,可以采用打散的方式来刷题,可以更好地锻炼思维的灵活性和应变能力,但初期或能力较弱的时候,按分类选题,是比较好的。
高频押题,也能极大提升刷题效率。北大ACM金牌大神的《九章算法课》帮大家整理出一份 刷一题等于刷3题 的算法题合集: 《算法面试精选100题》。 现在注册可以免费看3个押题视频,回复【吴师兄】还可领取《算法面试精选100题》,链接我放下面了。
解题三部曲
在具体做题的时候,可以采用以下三个步骤来进行。
拿到题目后,不要立马开干,想着下面的三个步骤,一步一步地来。
1. 看懂题目
看懂题目。有的题目很直接,直接告诉你要解决的问题是什么,题目本身甚至都包含了对应的数据结构和需要用到的算法;有的题目很隐晦,看了半天不知道它到底要解决什么问题,可以用什么算法和数据结构来解。所以,看到题目后,一定要先确保自己理解清楚了。
我的一个经验是,拿到一个题目后,看5分钟,如果5分钟之内看不懂,我就mark 下来,留到后面再做,要不很影响刷题的心情。
不过就leetcode 来说,这样的题目不多。基本都能在再5分钟内看懂。
中场休息:双击点个赞?
2.分析,推导解法
分析推导题目的解法。
这个步骤要有意识地单独拎出来,不要跟编码步骤混淆在一起。也就是说,你在分析推导题目解法的时候,不要去想任何实现相关地事情,不用去想代码怎么写,不用去想要用什么库,定义什么变量,用多少层循环,都不要想,就想着在逻辑上,这道题目要怎么解。
这样做可以极大地降低你的心智负担,使你高效地想出题目的解法。对于如何将想法变成代码,可以留在下一个步骤,单独来进行。
3.将思路转换为代码
当你确定题目都已经理解,并且分析推导出了题目的解法后,你才开始来思考如何将自己的思路转换成代码。是地,将思路转换成代码,可以是一个单独地步骤,在实际工作中,其实也是很重要的一个能力。
有时,将一个思路转换成算法是很容易且自然的;但有时,有些思路转换成代码,是很有难度的事情。
或者你有体会,分析推导只用了不到十分钟,结果代码写了半小时还写不完整。
怎么定义变量,保存状态,用递归,还是用循环加辅助数据结构等等,都是将思路转换成代码要做的事情。
这个能力也需要刻意地去练习。
算法的封装
接下来,说点更细节的东西,算法的封装。
软件设计里面,最关键的思想就是抽象和封装了。
其实解题也可以用到这种思路。
比如一道题目的正确解法是先排序,再进行二分查找,那你的脑子里面只要记得,快速排序和二分查找,就可以了,不需要去想,快速排序和二分查找的具体实现。
就像我们在写代码的时候,遇到排序,查找,我们一般都直接使用了现成的函数库,而不需要自己动手再写一遍。这个是代码层面封装带来的好处,思维层面的封装也是一样的道理。
这种封装思想在做题的时候可以极大地减轻我们的心智负担,使得自己的脑力可以发挥在问题的核心点上。
用封装的思维去解题,你的解题能力会有快速地提升。
封装的思想可以用于 “2.分析,推导解法” 的过程,在 “3.将思路转换为代码” 的过程,更是可以用语言内置的算法函数,数据结构来直接实现,也使得从思路转换到代码的过程更加的直观和自然。
在实际的面试或比赛中,除非有特殊说明,一般都可以放心地使用语言的内置算法和数据结构。
然后你可能会问,对于像排序,查找这些基础的算法应该怎么对待呢?我的建议是可以把它们当作重要算法来刻意练习。
快排,快搜,堆排序等,我们可以称它们为元算法。
对于这些算法的刻意练习。一开始的时候,要看算法书的描述,确保自己理解了算法的思路,然后尝试自己实现一遍。
实在写不出来,就参照或者直接抄。一个算法花几天的时间,大部分人都是可以理解并自己实现出来的。(排除一些特别难的,需要更长的时间)。
保持持续的动力
算法能力的提升,是一个长期的事情,需要持续地学习和做题,而刷题又是个比较枯燥的过程,在遇到难题的时候,很容易产生挫败感,甚至导致直接放弃。
所以这里需要特别关注刷题时的正反馈。如果你老是无法解出某个难度或某个类别的题目的时候,你就要考虑降低难度,或者安排额外的时间,去更全面的复习特定的算法和数据结构了。
注意不要死磕!算法学习,特别讲求方法和技巧,死磕非但磕不过去,还可能留下对算法的心里阴影,导致学习障碍。
总结
首先算法不是只拼智商的,是可以通过后天的刻意练习掌握的一种能力。
刚上手的时候,难度上需要循序渐进,最好能够按算法分类来刷题。
解题的时候,建议按这三个步骤来
1,看懂题目
2,分析,推导解法
3,将思路转换为代码。
在更细节方面,封装的思想也可使用在算法上面,可以极大地降低我们的心智负担,提升解题的效率。
最后是要注意做题过程中的正反馈,确保自己能持续地做下去。
希望这里分享的经验技巧,能给大家带来帮助:)
作者:大飞哥 原文链接: https:// mp.weixin.qq.com/s/EoN9 yzzapNqCeQp6lWdtYg
以下是我个人刷题过程中用到的资料和知识总结,感兴趣的也可以点进去收藏一下。
再推荐一下书籍给大家进行参考学习。
入门系列
入门的同学,我建议你不要过度追求上去就看经典书。
不要一来就拿着《算法导论》开始啃,初学就去啃这些书肯定会很费劲。你一旦啃不下来,挫败感就会很强。
然后就放弃学算法了。
所以,入门的同学,我建议你找一些比较容易看的书来看,比如《大话数据结构》和《算法图解》。
不要太在意书写得深浅,重要的是能不能坚持看完。
《大话数据结构》 这本书最大的特点是,它把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合生活中的例子进行了讲解, 能让你有非常直观的感受。
虽然这本书有 400 多页,但是花两天时间读完,应该是没问题的。
如果你之前完全不懂数据结构和算法,可以先从这本书看起。
《算法图解》 跟《大话数据结构》走的是同样的路线,就像这本书副标题写的那样,“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂。它只有不到 200 页,所以内容比较少。
作为入门,看看这本书,能让你对数据结构和算法有个大概的认识。
当然,这些入门书共同的问题是,缺少细节,不够系统,也不够严谨。
所以,如果你想要系统地学数据结构和算法,看这两本书肯定是不够的。
基础系列
通过基本入门算法书的调教,你已经逐渐体会到了算法的魅力,现在正是时候踏入基础系列算法的领域!!!
这些书籍需要你费点心思去阅读。
很多同学在学习的过程中,看到一篇算法科普文章经常会有这样的想法。
哎呀,要是文章的代码是 Java 语言就好了呀。
哎呀,要是文章的代码是 Python 语言就好了呀。
虽然代码并不会很严重影响阅读,但还是有很多强迫症的同学喜欢看到文章的解释代码是自己擅长的。
我这里推荐《数据结构和算法分析》,这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心。
他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 :C 语言描述》《数据结构与算法分析:C++ 描述》《数据结构与算法分析:Java 语言描述》。
面试实战系列
大家都知道,对于程序员来说很大程度上算法就是为了应付面试的。
所以,推荐三本有益于面试的书籍,分别是:《剑指 offer》《编程珠玑》《编程之美》。
《剑指 offer》这本书的目的非常明确,就是为了面试。
这本书几乎包含了所有常见的、经典的面试题。如果能搞懂这本书里的内容,应付一般公司的面试应该不成问题。
我做了一个 图解《剑指 offer》的小程序,应该能帮助你学习,感兴趣的可以在微信搜索 图解剑指offer。
我也在 B 站录制了一些图解剑指 offer 的免费视频课程,感兴趣的也可以看看,每个视频控制在5分钟以内。
《编程珠玑》这本书的豆瓣评分非常高,有 9 分。
这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。
《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。
你可以按照以下的路径先去刷 200 道 LeetCode 题目。
第一周,链表、栈、队列
1、 链表的基础知识:单链表
9、 栈的基础知识
16、 队列的基础知识
19、设计循环双端队列( LeetCode 641 )
25、 链表中倒数第 k 个节点( 剑指Offer 22 )
第二周,递归、排序、贪心
1、 递归基础知识
2、 冒泡排序基础知识
3、 选择排序基础知识
4、 插入排序基础知识
5、 快速排序基础知识
6、 计数排序基础知识
7、 归并排序
8、桶排序(了解即可)
9、堆排序
10、基数排序(了解即可)
11、希尔排序(了解即可)
13、 颜色分类( LeetCode 75 ) (✨有作业)
14、 部分排序 (面试题 16)
15、 计算右侧小于当前元素的个数 ( LeetCode 315)
18、 盛最多水的容器 ( LeetCode 11) (✨有作业)
19、 两数之和(LeetCode 1) (✨有作业)
20、二叉堆基础知识
23、用最少数量的箭引爆气球( LeetCode 452 )
25、 跳跃游戏( LeetCode 55 ) (✨有作业)
27、买卖股票的最佳时机 II( LeetCode 122 )
30、加油站( LeetCode 134 )
31、合并区间( LeetCode 56 )
第三周,搜索算法、回溯算法、位运算、二分查找
1、 二分查找基础知识
4、 在排序数组中查找元素的第一个和最后一个位置( LeetCode 34 ) (✨有作业)
5、 搜索旋转排序数组( LeetCode 33 ) (✨有作业)
9、 剑指 Offer 53 – II. 0~n-1中缺失的数字
10、 剑指 Offer 53 – I. 在排序数组中查找数字 I
11、剑指 Offer 51. 数组中的逆序对
13、第一个错误的版本( LeetCode 278 )
16、 位运算基础知识
19、比特位计数( LeetCode 338 )
20、位 1 的个数( LeetCode 191 )
21、 只出现一次的数字 II( LeetCode 137 )
22、只出现一次的数字 III( LeetCode 260 )
23、最大单词长度乘积( LeetCode 318 )
24、汉明距离( LeetCode 461 )
25、 回溯基础知识
26、 岛屿数量( LeetCode 200 ) (✨有作业)
27、 N 皇后( LeetCode 51 ) (✨有作业)
28、子集( LeetCode 78 )
29、组合总和 II( LeetCode 40 )
30、括号生成( LeetCode 22 )
32、接雨水 II( LeetCode 407 )
33、组合( LeetCode 77 )
34、组合总和 II( LeetCode 216 )
35、分割回文串( LeetCode 131 )
36、全排列( LeetCode 46 )
第四周,二叉树
1、 二叉树基础知识
6、 二叉树的锯齿形层序遍历( LeetCode 103 )
7、 从前序与中序遍历序列构造二叉树( LeetCode 105 )
12、 将有序数组转换为二叉搜索树( LeetCode 108 )
13、 把二叉搜索树转换为累加树( LeetCode 538 )
14、 删除二叉搜索树中的节点( LeetCode 450 )
15、 二叉树的序列化与反序列化( LeetCode 297 )
16、 完全二叉树的节点个数( LeetCode 222 )
24、 二叉搜索树的最近公共祖先( LeetCode 235 )
25、 二叉搜索树的最小绝对差( LeetCode 530 )
第五周,动态规划、背包问题
1、动态规划基础知识和解题步骤
3、斐波那契数( LeetCode 509 )
6、零钱兑换 II( LeetCode 518 )
10、 买卖股票的最佳时机II( LeetCode 122 )
11、 买卖股票的最佳时机III( LeetCode 123 )
12、 买卖股票的最佳时机IV( LeetCode 188 )
13、 最佳买卖股票时机含冷冻期(LeetCode 309)
14、 买卖股票的最佳时机含手续费(LeetCode 714)
20、不同的二叉搜索树( LeetCode 96 )
21、地下城游戏( LeetCode 174 )
31、最长回文子串( LeetCode 5 )
31、01 背包问题
32、目标和( LeetCode 494 )
33、最后一块石头的重量 II( LeetCode 1049 )
第六周,剑指 Offer 系列
在大厂的面试中,频繁的出现《剑指 Offer》上面的原题。
众所周知,刷题有一个很重要的技巧就是按照标签来刷,在某个时间段内只刷相对应的题目,这种做法可以极大的提高刷题的速度,而且能带来更好的效果。
1、持续地刷同个类型的题目,可以不断地巩固和加深理解。
2、可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。
而关于《剑指 Offer》,发现一个宝藏网站,里面的每一道都是算法面试的高频类型,并且提供详细的分析、精美的配图、易于理解的动画操作、保姆级别的注释、手把手的视频讲解。
剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - III. 从上到下打印二叉树 III
https:// blog.algomooc.com/055.h tml
https:// blog.algomooc.com/0552. html
为了避免知乎大佬觉得我吹逼,先贴一下自己的 GitHub 地址, 目前 70,000 star,全球排名 51 名。
https:// github.com/MisterBooo
算法是一种技能,是可以通过科学合理的方式训练出来的能力。
在想刷题之前,得从心里认识到接受刷题很重要,才能坚持去刷题。
江湖有个传言: 国内刷 LeetCode,最多够你吃 1 年老本;湾区刷 LeetCode ,够你吃 10 年老本了。
为什么湾区的刷题性价比这么高呢?
你想想,电面考 4 道题,一道题值 5 万!单位是 Dollar !
刷到就是赚到!!
想想是不是很刺激,有没有动力开始刷题了!可以提速刷题了!
就目前互联网的情况来说,无论是面国外大厂还是面国内大厂,如果想换工作都要去刷题,一面二面不丢你几道 Hard 题,都对不住你偷偷摸摸找个会议室假装开会实则面试的鸡贼。
同时,还得认识到一点, 面试能力和你平时的工作能力其实差别挺大的。
有些人技术挺厉害的,但没有刷题,一面二面都过不了, 而某些小镇刷题家,还真就靠刷题拿下了 Google、微软、脸书等大厂offer。
国内大厂也有这种趋势,比如字节,一大半都是面试题。
要不是他提前先看视频刷题,妥妥得凉凉。
所以,刷题很重要。
(PS:感谢大家耐心的阅读,算法是程序员的重中之重,必须攻克,大厂面试必考,顺便送一份阿里大佬刷Leetcode总结的算法笔记,如果你能吃透,那我相信80%的技术面试都会不在话下:
BAT大佬写的Leetcode刷题笔记,看完秒杀80%的算法题!
这本书的目录,非常经典:
刷题大概可以分为 4 个阶段。
1、纯小白, 不知道怎么刷题,对很多概念都很陌生,各种数据结构和知识点几乎完全不懂,打开 LeetCode 第一题,满头问号。
有人相爱、有人夜里开车看海、有人 LeetCode 第一题都做不出来。
2、算法上基本已经入门,Easy 可以做出来,Medium 纠结半天也能有头绪,但基础不牢,比如字符转字符串还得 Google 一下。
3、刷了几百道题后,总结了自己的解题模板,参加周赛有时候甚至可以全部完成。
4、开始以 beat 100% 作为 AC 的目标了。
就目前的算法面试大环境来说,能达到第二阶段,中小公司可以应付过去了,到达第三阶段,字节、腾讯算法面试环节妥妥没问题了。
怎么样到达第三阶段?
给一下我的一些小建议吧。
1、如果目标是国内大厂,那么一定要刷足够的题,不需要把 LeetCode 上 2500 道算法题都刷完,但至少刷 200 道算法高频题,这些高频题我都写了题解同时也录制了视频,
在这个链接总结了: https://www. algomooc.com/1659.html
2、面试前一周以看题为主,因为刷题也刷不了几题,多看看自己总结或者别人总结的模板,比如回溯算法模板,掌握后,几十道回溯题都不在话下。
一些模板:
3、刷题过程需要注意难度要循序渐进,算法训练是一个系统工程,需要循序渐进,太过于急功近利,反而容易因做不出难题而产生挫败感,带来反效果。
如果你本身有基础,熟练度高,那你刷简单的 LeetCode 应该是几分钟一题,几分钟一题的,花不了你多少时间。
如果你刷简单都花费很长时间,说明熟练度不够,就更应该从简单开始,然后过度到中等,再过度到困难。
并且,目前国内大厂的算法考察,基本不会超过 LeetCode 中等难度,上限难度基本都是 LeetCode 中等题里面的中等难度,所以不要太去纠结难题怪题偏题。
把高频题掌握就行了: https://www. algomooc.com/1659.html
再退一步,如果你觉得 LeetCode 的题目太难,可以先从《剑指 Offer》上的算法题开始学起。
为了帮助大家更好的入门学习算法,经过半年的积累,我给大家 卷 了《剑指 Offer》系列的三十道题目,结合动画的形式录制了视频,相信能帮助你更好的刷题。
领取地址:
4、 按算法分类来选题,比如 一个时间段,只刷链表题,刷得差不多的时候,接下来再刷二叉树的题。
这样做有几个很明显的好处。
一、持续地刷同个类型的题目,可以不断地巩固和加深理解,可以总结出自己的思考路径或者解题模板。
比如链表题目,就会去思考虚拟头节点、双指针、快慢指针。
二、可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。
我一直认为读书是世界上性价比最高的成长方式,书很便宜但分量很重,是让我们摆脱平庸走向卓越的方式之一。
对于计算机专业的学生而言,读计算机经典书籍不光能让你快速提升知识和能力,更会让你在校招之际如虎添翼。
书籍下载: 计算机必看经典书籍(含下载方式)
最后,再给大家送上点干货!
下面这是一个 高赞回答合集 ,建议大家 点赞&收藏 ,Mark住别丢了, 大学期间绝对用得上 。
1、怎么学好数据结构,看下面这个回答,已经获得了 21000+ 的赞和 50000+的收藏。
2、如何系统地学习算法,看下面这个回答,已经获得了 11000+ 的赞和 26000+的收藏。
3、新手该如何使用 GitHub,看下面这个回答,如果在大学期间就知道使用 GitHub ,那么能力远超同龄人。
4、想成为一名优秀的程序员,那么这些程序员平时都喜欢逛的论坛怎么说你也得收藏一些吧。
5、无论别人怎么说,我都是坚定不移的选择计算机专业。
6、如何系统地学习 C++ ,这个回答能帮你找到路线。
7、想要准备 Java 面试,那么这些面试题必须掌握。
赶紧点赞和收藏吧~