相关文章推荐
谈吐大方的铁链  ·  gridview ...·  1 年前    · 

如何科学的刷 LeetCode ?

6 个月前

算法很重要,但算法也是学起来最难,最令人生畏的。

特别是刷 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,将思路转换为代码。

在更细节方面,封装的思想也可使用在算法上面,可以极大地降低我们的心智负担,提升解题的效率。

最后是要注意做题过程中的正反馈,确保自己能持续地做下去。

希望这里分享的经验技巧,能给大家带来帮助:)

作者:大飞哥 原文链接: mp.weixin.qq.com/s/EoN9

以下是我个人刷题过程中用到的资料和知识总结,感兴趣的也可以点进去收藏一下。



再推荐一下书籍给大家进行参考学习。

入门系列

入门的同学,我建议你不要过度追求上去就看经典书。

不要一来就拿着《算法导论》开始啃,初学就去啃这些书肯定会很费劲。你一旦啃不下来,挫败感就会很强。

然后就放弃学算法了。

所以,入门的同学,我建议你找一些比较容易看的书来看,比如《大话数据结构》和《算法图解》。

不要太在意书写得深浅,重要的是能不能坚持看完。

《大话数据结构》 这本书最大的特点是,它把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合生活中的例子进行了讲解, 能让你有非常直观的感受。

虽然这本书有 400 多页,但是花两天时间读完,应该是没问题的。

如果你之前完全不懂数据结构和算法,可以先从这本书看起。

《算法图解》 跟《大话数据结构》走的是同样的路线,就像这本书副标题写的那样,“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂。它只有不到 200 页,所以内容比较少。

作为入门,看看这本书,能让你对数据结构和算法有个大概的认识。

当然,这些入门书共同的问题是,缺少细节,不够系统,也不够严谨。

所以,如果你想要系统地学数据结构和算法,看这两本书肯定是不够的。

基础系列

通过基本入门算法书的调教,你已经逐渐体会到了算法的魅力,现在正是时候踏入基础系列算法的领域!!!

这些书籍需要你费点心思去阅读。

很多同学在学习的过程中,看到一篇算法科普文章经常会有这样的想法。

哎呀,要是文章的代码是 Java 语言就好了呀。

哎呀,要是文章的代码是 Python 语言就好了呀。

虽然代码并不会很严重影响阅读,但还是有很多强迫症的同学喜欢看到文章的解释代码是自己擅长的。

我这里推荐《数据结构和算法分析》,这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心。

他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 :C 语言描述》《数据结构与算法分析:C++ 描述》《数据结构与算法分析:Java 语言描述》。

面试实战系列

大家都知道,对于程序员来说很大程度上算法就是为了应付面试的。

所以,推荐三本有益于面试的书籍,分别是:《剑指 offer》《编程珠玑》《编程之美》。

《剑指 offer》这本书的目的非常明确,就是为了面试。

这本书几乎包含了所有常见的、经典的面试题。如果能搞懂这本书里的内容,应付一般公司的面试应该不成问题。

我做了一个 图解《剑指 offer》的小程序,应该能帮助你学习,感兴趣的可以在微信搜索 图解剑指offer。

我也在 B 站录制了一些图解剑指 offer 的免费视频课程,感兴趣的也可以看看,每个视频控制在5分钟以内。



《编程珠玑》这本书的豆瓣评分非常高,有 9 分。

这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。

《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。

你可以按照以下的路径先去刷 200 道 LeetCode 题目。

第一周,链表、栈、队列

0、 时间复杂度与空间复杂度(补充内容)

1、 链表的基础知识:单链表

2、 反转链表( LeetCode 206 )

3、 相交链表( LeetCode 160 )

4、 合并两个有序链表 ( LeetCode 21 )

5、 分隔链表 ( LeetCode 86 )

6、 环形链表 II ( LeetCode 142 )

7、 反转链表 II ( LeetCode 92 )

8、 复制带随机指针的链表( LeetCode 138 )

9、 栈的基础知识

10、 有效的括号( LeetCode 20 )

11、 基本计算器( LeetCode 224 )

12、 最小栈( LeetCode 155 )

13、 验证栈序列( LeetCode 946 )

14、 每日温度( LeetCode 739 )

15、 接雨水( LeetCode 42 )

16、 队列的基础知识

17、 用栈实现队列 ( LeetCode 232 )

18、 滑动窗口最大值( LeetCode 239 )

19、设计循环双端队列( LeetCode 641 )

20、 移除链表元素( LeetCode 203 )

21、 K 个一组翻转链表( LeetCode 25 )

22、 回文链表( LeetCode 234 )

23、 奇偶链表( LeetCode 328 )

24、 从尾到头打印链表( 剑指Offer 06 )

25、 链表中倒数第 k 个节点( 剑指Offer 22 )

第二周,递归、排序、贪心

1、 递归基础知识

2、 冒泡排序基础知识

3、 选择排序基础知识

4、 插入排序基础知识

5、 快速排序基础知识

6、 计数排序基础知识

7、 归并排序

8、桶排序(了解即可)

9、堆排序

10、基数排序(了解即可)

11、希尔排序(了解即可)

12、 合并两个有序数组( LeetCode 88 )

13、 颜色分类( LeetCode 75 ) (✨有作业)

14、 部分排序 (面试题 16)

15、 计算右侧小于当前元素的个数 ( LeetCode 315)

16、 合并 K 个升序链表(LeetCode 23)

17、 有序数组的平方( LeetCode 977 )

18、 盛最多水的容器 ( LeetCode 11) (✨有作业)

19、 两数之和(LeetCode 1) (✨有作业)

20、二叉堆基础知识

21、 分发饼干( LeetCode 455 )

22、 柠檬水找零( LeetCode 860 )

23、用最少数量的箭引爆气球( LeetCode 452 )

24、 移掉 K 位数字( LeetCode 402 )

25、 跳跃游戏( LeetCode 55 ) (✨有作业)

26、 摆动序列( LeetCode 376 )

27、买卖股票的最佳时机 II( LeetCode 122 )

28、 三数之和(LeetCode 15)

29、 最接近三数之和(LeetCode 16)

30、加油站( LeetCode 134 )

31、合并区间( LeetCode 56 )

第三周,搜索算法、回溯算法、位运算、二分查找

1、 二分查找基础知识

2、 二分查找( LeetCode 704 )

3、 搜索插入位置( LeetCode 35 )

4、 在排序数组中查找元素的第一个和最后一个位置( LeetCode 34 ) (✨有作业)

5、 搜索旋转排序数组( LeetCode 33 ) (✨有作业)

6、 搜索二维矩阵( LeetCode 74 )

7、 寻找两个正序数组的中位数( LeetCode 4 )

8、 有效三角形的个数( LeetCode 611 )

9、 剑指 Offer 53 – II. 0~n-1中缺失的数字

10、 剑指 Offer 53 – I. 在排序数组中查找数字 I

11、剑指 Offer 51. 数组中的逆序对

12、 寻找峰值( LeetCode 162 )

13、第一个错误的版本( LeetCode 278 )

14、 山脉数组的峰顶索引( LeetCode 852 )

15、 有效的完全平方数( LeetCode 367 )

16、 位运算基础知识

17、 丢失的数字( LeetCode 268 )

18、 2 的幂( LeetCode 231 )

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 )

31、 火柴拼正方形( LeetCode 437 )

32、接雨水 II( LeetCode 407 )

33、组合( LeetCode 77 )

34、组合总和 II( LeetCode 216 )

35、分割回文串( LeetCode 131 )

36、全排列( LeetCode 46 )

第四周,二叉树

1、 二叉树基础知识

2、 二叉树的前序遍历( LeetCode 144 )

3、 二叉树的中序遍历( LeetCode 94 )

4、 二叉树的后序遍历( LeetCode 145 )

5、 二叉树的层序遍历( LeetCode 102 )

6、 二叉树的锯齿形层序遍历( LeetCode 103 )

7、 从前序与中序遍历序列构造二叉树( LeetCode 105 )

8、 路径总和 II( LeetCode 113 )

9、 二叉树的最近公共祖先( LeetCode 236 )

10、 二叉树的右视图( LeetCode 199 )

11、 二叉树展开为链表( LeetCode 114 )

12、 将有序数组转换为二叉搜索树( LeetCode 108 )

13、 把二叉搜索树转换为累加树( LeetCode 538 )

14、 删除二叉搜索树中的节点( LeetCode 450 )

15、 二叉树的序列化与反序列化( LeetCode 297 )

16、 完全二叉树的节点个数( LeetCode 222 )

17、 二叉树的最大深度( LeetCode 104 )

18、 二叉树的最小深度( LeetCode 111 )

19、 二叉树的所有路径( LeetCode 257 )

20、 平衡二叉树( LeetCode 110 )

21、 左叶子之和( LeetCode 404 )

22、 找树左下角的值( LeetCode 513 )

23、 修剪二叉搜索树( LeetCode 669 )

24、 二叉搜索树的最近公共祖先( LeetCode 235 )

25、 二叉搜索树的最小绝对差( LeetCode 530 )

26、 最大二叉树( LeetCode 654 )

第五周,动态规划、背包问题

1、动态规划基础知识和解题步骤

2、 爬楼梯( LeetCode 70 )

3、斐波那契数( LeetCode 509 )

4、 最大子序和( LeetCode 53 )

5、 零钱兑换( LeetCode 322 )

6、零钱兑换 II( LeetCode 518 )

7、 最小路径和( LeetCode 64 )

8、 编辑距离( LeetCode 72 )

9、 买卖股票的最佳时机( LeetCode 121 )

10、 买卖股票的最佳时机II( LeetCode 122 )

11、 买卖股票的最佳时机III( LeetCode 123 )

12、 买卖股票的最佳时机IV( LeetCode 188 )

13、 最佳买卖股票时机含冷冻期(LeetCode 309)

14、 买卖股票的最佳时机含手续费(LeetCode 714)

15、 完全平方数( LeetCode 279 )

16、 三角形最小路径和( LeetCode 120 )

17、 不同路径( LeetCode 62 )

18、 不同路径II( LeetCode 63 )

19、 整数拆分( LeetCode 343 )

20、不同的二叉搜索树( LeetCode 96 )

21、地下城游戏( LeetCode 174 )

22、 打家劫舍( LeetCode 198 )

23、 打家劫舍II( LeetCode 213 )

24、 打家劫舍III( LeetCode 337 )

25、 最长递增子序列( LeetCode 300 )

26、 最长连续递增序列( LeetCode 674 )

27、 分割等和子集( LeetCode 416 )

28、 最长重复子数组( LeetCode 718 )

29、 最长公共子序列( LeetCode 1143 )

30、 最长回文子序列( LeetCode 516 )

31、最长回文子串( LeetCode 5 )

31、01 背包问题

32、目标和( LeetCode 494 )

33、最后一块石头的重量 II( LeetCode 1049 )

第六周,剑指 Offer 系列

在大厂的面试中,频繁的出现《剑指 Offer》上面的原题。

众所周知,刷题有一个很重要的技巧就是按照标签来刷,在某个时间段内只刷相对应的题目,这种做法可以极大的提高刷题的速度,而且能带来更好的效果。

1、持续地刷同个类型的题目,可以不断地巩固和加深理解。

2、可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。

而关于《剑指 Offer》,发现一个宝藏网站,里面的每一道都是算法面试的高频类型,并且提供详细的分析、精美的配图、易于理解的动画操作、保姆级别的注释、手把手的视频讲解。

剑指 Offer 03. 数组中重复的数字

剑指 Offer 04. 二维数组中的查找

剑指 Offer 05. 替换空格

剑指 Offer 06. 从尾到头打印链表

剑指 Offer 09. 用两个栈实现队列

剑指 Offer 11. 旋转数组的最小数字

剑指 Offer 12. 矩阵中的路径

剑指 Offer 18. 删除链表的节点

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

剑指 Offer 22. 链表中倒数第k个节点

剑指 Offer 24. 反转链表

剑指 Offer 25. 合并两个排序的链表

剑指 Offer 26. 树的子结构

剑指 Offer 30. 包含min函数的栈

剑指 Offer 32 - I. 从上到下打印二叉树

剑指 Offer 32 - II. 从上到下打印二叉树 II

剑指 Offer 32 - III. 从上到下打印二叉树 III

剑指 Offer 33. 二叉搜索树的后序遍历序列

剑指 Offer 41. 数据流中的中位数

剑指 Offer 42. 连续子数组的最大和

剑指 Offer 45. 把数组排成最小的数

剑指 Offer 46. 把数字翻译成字符串

剑指 Offer 47. 礼物的最大价值

剑指 Offer 50. 第一个只出现一次的字符

剑指 Offer 51. 数组中的逆序对

剑指 Offer 52. 两个链表的第一个公共节点

剑指 Offer 53 - I. 在排序数组中查找数字 I

剑指 Offer 53 - II. 0~n-1中缺失的数字

剑指 Offer 54. 二叉搜索树的第k大节点

剑指 Offer 55 - I. 二叉树的深度

blog.algomooc.com/055.h

blog.algomooc.com/0552.

剑指 Offer 57. 和为s的两个数字

剑指 Offer 58 - II. 左旋转字符串

剑指 Offer 61. 扑克牌中的顺子

剑指 Offer 66. 构建乘积数组

为了避免知乎大佬觉得我吹逼,先贴一下自己的 GitHub 地址, 目前 70,000 star,全球排名 51 名。

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 道算法高频题,这些高频题我都写了题解同时也录制了视频,

在这个链接总结了: algomooc.com/1659.html

2、面试前一周以看题为主,因为刷题也刷不了几题,多看看自己总结或者别人总结的模板,比如回溯算法模板,掌握后,几十道回溯题都不在话下。

一些模板:

3、刷题过程需要注意难度要循序渐进,算法训练是一个系统工程,需要循序渐进,太过于急功近利,反而容易因做不出难题而产生挫败感,带来反效果。

如果你本身有基础,熟练度高,那你刷简单的 LeetCode 应该是几分钟一题,几分钟一题的,花不了你多少时间。

如果你刷简单都花费很长时间,说明熟练度不够,就更应该从简单开始,然后过度到中等,再过度到困难。

并且,目前国内大厂的算法考察,基本不会超过 LeetCode 中等难度,上限难度基本都是 LeetCode 中等题里面的中等难度,所以不要太去纠结难题怪题偏题。

把高频题掌握就行了: algomooc.com/1659.html

再退一步,如果你觉得 LeetCode 的题目太难,可以先从《剑指 Offer》上的算法题开始学起。

为了帮助大家更好的入门学习算法,经过半年的积累,我给大家 了《剑指 Offer》系列的三十道题目,结合动画的形式录制了视频,相信能帮助你更好的刷题。

领取地址:

4、 按算法分类来选题,比如 一个时间段,只刷链表题,刷得差不多的时候,接下来再刷二叉树的题。

这样做有几个很明显的好处。

一、持续地刷同个类型的题目,可以不断地巩固和加深理解,可以总结出自己的思考路径或者解题模板。

比如链表题目,就会去思考虚拟头节点、双指针、快慢指针。

二、可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。

我一直认为读书是世界上性价比最高的成长方式,书很便宜但分量很重,是让我们摆脱平庸走向卓越的方式之一。

对于计算机专业的学生而言,读计算机经典书籍不光能让你快速提升知识和能力,更会让你在校招之际如虎添翼。

书籍下载: 计算机必看经典书籍(含下载方式)

最后,再给大家送上点干货!

下面这是一个 高赞回答合集 ,建议大家 点赞&收藏 ,Mark住别丢了, 大学期间绝对用得上

1、怎么学好数据结构,看下面这个回答,已经获得了 21000+ 的赞和 50000+的收藏。

2、如何系统地学习算法,看下面这个回答,已经获得了 11000+ 的赞和 26000+的收藏。

3、新手该如何使用 GitHub,看下面这个回答,如果在大学期间就知道使用 GitHub ,那么能力远超同龄人。

4、想成为一名优秀的程序员,那么这些程序员平时都喜欢逛的论坛怎么说你也得收藏一些吧。

5、无论别人怎么说,我都是坚定不移的选择计算机专业。

6、如何系统地学习 C++ ,这个回答能帮你找到路线。

7、想要准备 Java 面试,那么这些面试题必须掌握。

赶紧点赞和收藏吧~

编辑于 2022-11-04 10:07 ・IP 属地广东