zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【算法】刷题路线(系统+全面)

算法系统 全面 刷题 路线
2023-09-14 09:14:18 时间

本系列基于当前各大公司对大公司的考察情况,给大家规划一条可行的算法刷题路线,大概会规划 200 道自认为有用的题,并且争取让初学者,能够刷起来更加丝滑,而且每个阶段都会进行相对应的说明。

当然,无论是面试还是笔试,你也完全可以按照这个路线来,应付大公司算法面试是够的了

算法学习的四个阶段


在刷题之前,我们先来说一下大致的规划,这部分主要说一个算法大致的学习路径,当然,我说的不是针对要打 ACM 的选手哦,大家可以参考一下算法的学习,总的来说算法最重要的还是刷题,没有很多的奇技淫巧。为了让大家更好对号入座,从 0 基础小白到上战场,我觉得算法的学习可以分成四个阶段。

后面的算法题,也会安排这种阶段来给大家安排。

阶段一:学习一门编程语言 + 做一些练习题

首先我觉得就是要学习一门编程语言,Java,C,C++都可以,不用纠结语言,不过我相信大家掌握完语言之后,代码能力还是非常差的,这个时候提高代码能力最快的方法就是:做习题,锻炼代码能力。

所以第一阶段就是一边学习编程语言,一边做题锻炼自己的编码能力 + 思维,做的这些题,最好不要涉及诸如回溯,动态规划等算法思想,而是应该做那些偏向逻辑的题,相当于是打基础了,比如我们在学习 C 语言的时候,也会有很多锻炼思维的题,比如打印各种排列的五角星啊,计算质数啊,简单的二分查找啊等等,这些题可以用来打基础用

通过这些练习,可以让你以后做起题来更加顺手,给你的代码能力打下很好的基础,反正我以前在自己学校 OJ 做过挺多,让我打下了相对扎实的基础。

为什么有些人按照某个攻略,刷了很多题,但是算法能力还是那么差?我觉得就是基础没打好,编码能力不大行,这个需要长期养成,特别是能够把想法转化成代码的这样一种编程能力,很多人就不大行,一想就会,一实际做就废。

不过阶段一,可能很多人都学过基本语法了,那么阶段一可能被你跳过了,那么也没事吧。

阶段二:学习基础数据结构

通过阶段1,大家有了一定的编码能力,但是距离去 Leetcode 刷题,或者去打比赛,那么还是不行的,因为很多题都会涉及诸如链表,队列,二叉树,哈希表等,如果你没接触过这些,那可能基本没法做。

所以第二阶段就是把数据结构学一下,理解复杂度的概念,以及会使用基本的数据结构,比如 Java 的常见集合,或者 C++ 的 STL(C也能调用STL),掌握了这些,你才能更好刷题。

其实内容也不多,就掌握常见的链表,队列,栈,二叉树,哈希表 就差不多了。

第三阶段:在刷题中踩坑与填坑

学完阶段1和2,你就可以去刷题了,题库目前比较流行的就是 leetcode,然后有一个疑问就是:我应该是按照顺序刷还是专题刷呢?

说实话,其实都可以(但是按顺序你要学会放弃某些题,你看leetcode第十题就是正则表达式,这道题是非常难的了),但无论按照那个方式刷,大家就是要记住一句话:踩坑与填坑。

PS:如果你不大会区分leetcode题目的难易程度,那么可以按专题刷,并且前期尽量刷简单和中等的题

什么意思?

就是在刷题的过程中,你会接触很多你没学过的方法,比如双指针,比如单调栈,比如贪心算法等等。

你一开始做,可能自己用的方法很粗暴,然后看题解,卧槽,还能这样子,于是你收获了这样一种算法思想,并且记忆深刻,这就是一个填坑的过程。

通过这种方式,你的思维和编码能力都能得到比较大的提升。

但是呢,有些算法思想可能你会很难一次就能填,比如动态规划,但是请大家不要纠结一次性就填完,同时请相信你踩多了之后,在未来可能就莫名理解了,卧槽,原来是这样。

所以呢,我觉得第三阶段,就是一个在踩坑中,不断拓展自己思维,不断积累方法的过程,而在这个过程里,你需要多去刷题,需要多去接触新的题型

因为算法很多题就是,你没接触过,你就真的做不出来,反正我觉得大部分是这样,毕竟不是天才。

所以我希望大家能够记住踩坑与填坑这个词,你需要去理解这个词,因为我看好多人刷了好多题,但是还好菜啊,我还挺奇怪的,反正我当时并没有刷多刷题,但是大部分 leetcode 的题,一刷就会了,一方面是我基础打的好,另外一方面就是,我是踩坑=>挣扎=>填坑,然后就理解的比较深刻,所以我是推荐这样一种方式的。

第四阶段:在比赛中成长

经过了阶段1,2和3,我相信大家已经入门了算法了,leetcode 常见的容易+中等题也会了,甚至面试时,大部分的题也会了,但是我敢保证,你做笔试题,可能还会一塌糊涂。

一个简单的原因就是:你之前做的题,大部分就是考察某种算法思想,而且题目也差不多告诉你应该用哪种方法了 + 题目描述特别简单。

但是等你上了笔试,可能你蒙了,卧槽要自己处理输入输出?卧槽这个题目描述我居然看不懂??

总的来说就是,笔试时,很多题时有一个具体的场景的,读题都需要一段时间,而且你可能不知道用啥方法,也有可能是多种方法的综合题。

所以你可能 4 道题只能做一道,或者 1.5 道,但是当你看到答案的时候,发现也不怎么难,但是你却不会,,,

这个时候,为了更好成长,我们需要去打比赛,在比赛中成长,至于去哪里打?

大家去打 Leetcode 周赛,牛客网周赛就可以了,leetcode 周赛知名度高一些。多参与几次,你的综合能力会慢慢得到提升。

所以我觉得,如果要想要变的更强,除了刷题,还要去参加比赛,在比赛中成长!但是比赛完,一定一定要去总结,不能打完就过了,即使去总结需要花很多时间,当然,太难的题建议就不理了,因为那不属于你

刷题顺序


注意,刷题没有严格顺序,专题刷或者顺序刷都可以,但是这对于初学者来说,容易遇到很难的题,进而被劝退,所以如果你没有明确的目标,你可以按照我这个顺序来刷题,本刷题顺序只是基于我个人的刷题理解,挑选了差不多 200 道题,并且会按照循环渐进且相对系统的方式给出题目,反正按照这个顺序刷,以后应付算法面试或者打蓝桥杯这些都是问题不大。

另外,本顺序会按照上面算法学习四个阶段来安排哦。

基础算法的掌握(20题)


PS:如果你不大懂时间复杂度这些,那么先看下这篇文章:漫画:别在问我什么是时间复杂度?

本章节会给出一些基础算法给大家刷,刷本章节你不需要去学习任何算法思想,你只要学过编程语言就能刷,这些题更多的是锻炼你的编码能力编程思维,对应算法四个阶段的阶段一

题型:本章节会涉及二分查找,双指针,简单位运算等基础算法,但这些都不需要提前去学,因为比较简单,并且你不需要这些技巧也能暴力做出来,之后去看答案学习优化,顺便学习这些技巧。

难度:基本都是属于 容易 级别的题,供大家训练思维 与编码。

提醒:

  1. 如果你算法有一定的基础的,那么你也可以跳过这一部分。
  2. 你可以不需要给出最优解,先会最暴力做出来就好了,之后看答案,最优解能看懂就看懂,看不懂就别理

1. 两数之和

13. 罗马数字转整数

26. 删除有序数组中的重复项

2022. 将一维数组转变成二维数组

剑指 Offer 39. 数组中出现次数超过一半的数字

88. 合并两个有序数组

704. 二分查找

69. x 的平方根

118. 杨辉三角

125. 验证回文串

344. 反转字符串

191. 位1的个数

326. 3 的幂

204. 计数质数

2427. 公因子的数目

1979. 找出数组的最大公约数

1984. 学生分数的最小差值

面试题61. 扑克牌中的顺子

812. 最大三角形面积

292. Nim 游戏

大家如果学校有 OJ 啥的,可以多去刷一刷这些不怎么难的思维题,当然,如果你这些简单的题做起来挺熟练了,那就没必要继续去做了,否则的话多做做还是挺不错,不用着急去学各种牛逼的算法思想,做了就会有用,如果大家能够把自己的想法转化成代码,那对你以后做各种题,一定可以打下非常好的基础。

这里也无法给出太多这种题,这 20 道主要给自己练一练手感,提高下大家的编程能力,而且这些题不会很难,也不会把大家劝退,接下来我们会分类来各种算法题型。

精选分类刷题说明

点击展开


有了前面的算法思维基础之后,我们开始来更加细致的刷题,那么这个阶段我个人是建议分类刷的,另外我认为分类刷题,我们要系统,什么意思呢?就是每个分类下面,也有不少题型,有些题型如果你没接触过,那么就会完全没有思路,所以呢,会在这个模块中,尽量系统着选出各类题,并且尽量全

当然,即使是简单的类别中,也会有一些比较难的题,我可能不会把这些题选进去,感觉没必要,因为这个时候的你算法还比较一般,对于一些比较难的题,要么我会做一些标记,要么会再最后面再放出来给大家做,总的来说就是:尽量让大家刷起来丝滑 + 尽量全面

链表(23道)


说到分类刷题,我觉得有了一定的算法基础之后,比如你做了上面的 20 多道题,能够写出简单算法之后 ,就可以开始刷链表的题了,链表题,思路不难,更多的还是考察你的编码能力 + 思维的严谨性,反正在面试的时候,特别容易出错,你以为你会了,代码一写,错误一大堆。

好了,下面会给出大概 20 多道链表题供大家刷,基本把大部分常见题型都覆盖了

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

160. 相交链表

203. 移除链表元素

19. 删除链表的倒数第 N 个结点

876. 链表的中间结点

21. 合并两个有序链表

61. 旋转链表

141. 环形链表

142. 环形链表 II

206. 反转链表

92. 反转链表 II

25. K 个一组翻转链表

83. 删除排序链表中的重复元素

82. 删除排序链表中的重复元素 II

148. 排序链表

234. 回文链表

382. 链表随机节点

138. 复制带随机指针的链表

146. LRU 缓存

460. LFU 缓存

707. 设计链表

1290. 二进制链表转整数

1472. 设计浏览器历史记录

队列与栈10


队列和栈的题比较少,所以这里给的题也不多,有不少题其实也用到队列和栈,不过归纳到其他题型里了,比如二叉树遍历相关,基本就离不开了,还有一些比较困难的,诸如单调栈相关的,很多都是困难级别的了,而且不容易理解,这种大家遇到了再学吧。

225. 用队列实现栈

232. 用栈实现队列

20. 有效的括号

32. 最长有效括号

150. 逆波兰表达式求值

155. 最小栈

下面几道是优先队列相关,这里我需要做一个说明,就是不借助IDEA,也能正确使用优先队列等函数

239. 滑动窗口最大值

347. 前 K 个高频元素

295. 数据流的中位数

451. 根据字符出现频率排序

二叉树(25道)


二叉树和链表类似,都是考察特别频繁的题,如果你理解了递归,那么二叉树做起来会容易很多,因为二叉树很多题基本都是需要递归求解。大家把一下的二叉树题刷了就差不多的了

94. 二叉树的中序遍历 容易

144. 二叉树的前序遍历 容易

145. 二叉树的后序遍历 容易

103. 二叉树的锯齿形层序遍历 中等

102. 二叉树的层序遍历 中等

107. 二叉树的层序遍历 II 中等

105. 从前序与中序遍历序列构造二叉树 中等

106. 从中序与后序遍历序列构造二叉 中等

230. 二叉搜索树中第K小的元素 中等

剑指 Offer 27. 二叉树的镜像 容易

101. 对称二叉树 容易

104. 二叉树的最大深度 容易

662. 二叉树最大宽度 中等

110. 平衡二叉树 容易

199. 二叉树的右视图 中等

112. 路径总和 容易

113. 路径总和 II 中等

437. 路径总和 III

257. 二叉树的所有路径 简单

129. 求根到叶子节点数字之和 中等

235. 二叉搜索树的最近公共祖先 中等

236. 二叉树的最近公共祖先 中等

124. 二叉树中的最大路径和 困难

114. 二叉树展开为链表 中等

297. 二叉树的序列化与反序列化 困难

回溯(19道)


回溯的题大部分都是暴力题,如果不大懂回溯,可以先去学习一下深度搜索和广度搜索,另外学会回溯非常重要吧,绝大部分题都可以回溯暴力求解,如果是在笔试,那么暴力求解可以拿到 33% 左右发分数。

不过回溯在面试中其实考的不怎么多,但是掌握这种思维我觉得非常重要吧。

401. 二进制手表 简单

22. 括号生成 中等

17. 电话号码的字母组合 中等

93. 复原IP地址 中等

39. 组合总和 中等

40. 组合总和 II 中等

216. 组合总和 III 中等

46. 全排列 中等

47. 全排列 II 中等

567. 字符串的排列 中等

78. 子集中等

90. 子集 II 中等

剑指 Offer 12. 矩阵中的路径 中等

剑指 Offer 13. 机器人的运动范围中等

剑指 Offer 34. 二叉树中和为某一值的路径 中等

89. 格雷编码 中等

51. N 皇后 困难

52. N皇后 II 困难

37. 解数独 困难

贪心算法(10道)


我觉得贪心的题,做做就好,其实很多题,你也不知道能否用贪心,而且也没有个明确的特性说它可以用贪心,有时候有了贪心也不一定是最优解,所以对于贪心这块,了解思想就好,知道有这么一回事

455. 分发饼干 简单

121. 买卖股票的最佳时机 简单

55. 跳跃游戏 中等

45. 跳跃游戏 II 中等

435. 无重叠区间 中等

714. 买卖股票的最佳时机含手续费 中等

921. 使括号有效的最少添加 中等

134. 加油站 中等

376. 摆动序列 中等

738. 单调递增的数字 中等

动态规划(24道)


动态规划不用说,又难又重要,大家如果能够把下面的题掌握,那应该问题就不大了,当然,如果从面试的角度看,其实掌握容易+中等的题就差不多了。我记得我一开始老是看的懂题解,但不会做,于是狂刷了四五十道DP的题,就掌握了方法了,之后挺多 DP 的题都能够做出来,具体看这篇文章:【动态规划】关于动态规划,我总结的解题步骤

70. 爬楼梯 容易

112. 路径总和 容易

113. 路径总和 II 中等

62. 不同路径 中等

63. 不同路径 II 中等

64. 最小路径和 中等

198. 打家劫舍 中等

213. 打家劫舍 II中等

221. 最大正方形 中等

322. 零钱兑换 中等

518. 零钱兑换 II 中等

5. 最长回文子串 中等

718. 最长重复子数组 中等

1143.最长上升子序列 中等

121. 买卖股票的最佳时机 容易

122. 买卖股票的最佳时机 II 中等

123. 买卖股票的最佳时机 III 困难

188. 买卖股票的最佳时机 IV 困难

42. 接雨水 困难

72. 编辑距离 困难

10. 正则表达式匹配 困难

152. 乘积最大子数组 中等

174. 地下城游戏 困难

85. 最大矩形 困难

数学知识与位运算(8道)


有一些题涉及到一些数学相关的,我这里随便挑选了几道吧。

1201. 丑数 III 中等

914. 卡牌分组 简单

1799. N 次操作后的最大分数和 困难

204. 计数质数 中等

172. 阶乘后的零 中等

136. 只出现一次的数字 简单

137. 只出现一次的数字 II 中等

260. 只出现一次的数字 III 中等

并查集(5道)


并查集的问题,主要就是把模版理解好,然后写熟悉,之后遇到,就会很好做了。

200. 岛屿数量 中等

547. 省份数量 中等

695. 岛屿的最大面积 中等

1020. 飞地的数量 中等

721. 账户合并 中等

排序(9道)


有一些题用道了排序相关的思维,一般快速排序 + 归并 + 堆 这三种多一些。

912. 排序数组

315. 计算右侧小于当前元素的个

561. 数组拆分

1122. 数组的相对排序

268. 丢失的数字

215. 数组中的第K个最大元素

347. 前 K 个高频元素

剑指 Offer 40. 最小的k个数

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

字符串与其他(16道)


其实字符串的题有很多了,而且绝大部分的字符串,都可以用动态规划解决,不过那些题被我划分道动态规划那里去了,然后还有一些题为觉得也很有必要做一下道,并且也不难,大家可以简单过一下,然后把一些其他的题也归纳进来

14. 最长公共前缀

6. N 字形变换

43. 字符串相乘

87. 扰乱字符串

208. 实现 Trie (前缀树)

415. 字符串相加

541. 反转字符串 II

31. 下一个排列

41. 缺失的第一个正数

50. Pow(x, n)

54. 螺旋矩阵

59. 螺旋矩阵 II

65. 有效数字

268. 丢失的数字

153. 寻找旋转排序数组中的最小值

154. 寻找旋转排序数组中的最小值

以上的题,基本覆盖面试中的所有考点,当然,应付面试不需要刷这么多,只要你能把我弄的这个学习路线的题搞懂,那你算法基本问题不大,这份攻略后面可能会慢慢补上题解,不过每一道题,leetcode 也有对应的题解,大家按照我这个顺序去刷题就可以了。

大家加油!