专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
中国城市规划  ·  理论研究 | ... ·  3 天前  
中国城市规划  ·  一图读懂 | 深圳的公园将如何命名? ·  4 天前  
中国交建  ·  阿狸的夏天 ·  2 天前  
中国交建  ·  奋进之春丨中交集团中标这些项目④ ·  2 天前  
51好读  ›  专栏  ›  吴师兄学算法

春招启动,你就按照这个顺序刷题!

吴师兄学算法  · 公众号  ·  · 2024-03-13 11:10

正文

1、LeetCode 题目太多,全部刷完肯定不是最好最有效的方式,其中涉及到的基本知识点来来回回就那些,同时有非常多的类似题,所以刷经典题,掌握这些经典题是最有效的学习方式。

2、从算法训练营第一期开始到现在的第十二期,吴师兄整理和迭代了非常多的刷题顺序,经过这两年的同学们的反馈,终于整理出一份我认为是最适合新手小白转码同学的 LeetCode 刷题顺序。

3、本刷题顺序涵盖了 205 道算法题,如果你的自学能力强,每天能够投入 2 小时的刷题时间,两个月左右是可以做到完完整整的全部刷完。

4、视频学习课程: 玩转 100 道高频算法题!

第一天(周一)

  • 1、Python 语法知识
  • 2、Java 语法知识

1、参考网站:https://www.runoob.com/

2、只需要掌握相关编程语言的基础语法、对象初始化、基本数据类型、变量类型、循环语句、条件语句这些知识即可开始刷题。

第二天(周二)

数组

数组作为最简单一个数据结构,单独考察的概率非常低,它往往是结合其它算法进行考察的。通过下面的题目帮助大家理解数组的一些基本操作。

  • LeetCode26、删除有序数组中的重复项
  • LeetCode 283、移动零
  • LeetCode 485、最大连续 1 的个数
  • LeetCode 27、移除元素

第三天(周三)

链表

链表题目的一些知识点。

1、天然的具备递归性,递归的系统学习安排在第五周的内容

2、设置虚拟头结点,可以起到非常好的效果

  • LeetCode 24、两两交换链表中的节点
  • LeetCode 160、相交链表
  • LeetCode 203、移除链表元素
  • LeetCode 19、删除链表的倒数第 N 个结点

第四天(周四)

链表

  • LeetCode 21、合并两个有序链表
  • LeetCode 328、奇偶链表
  • LeetCode 92 、反转链表 II

第五天(周五)

1、体会栈在【括号配对】类型题目中的应用。

2、体会栈在【表达式求值】类型题目中的应用。

  • LeetCode 20、有效的括号
  • LeetCode 155、最小栈
  • LeetCode 150、逆波兰表达式求值

第六天(周六)

  • LeetCode 2、两数相加
  • LeetCode 394、字符串解码
  • LeetCode 224、基本计算器
  • LeetCode 32、最长有效括号

第七天(周日)

前置知识:单调栈。

  • LeetCode 1475、商品折扣后的最终价格
  • LeetCode 739、每日温度
  • LeetCode 84、柱状图中的最大矩形
  • LeetCode 42、接雨水

第八天(周一)

  • LeetCode 232、用栈实现队列
  • LeetCode 641、设计循环双端队列
  • LeetCode 264、丑数II
  • LeetCode 373、查找和最小的 K 对数字

第九天(周二)

  • LeetCode 217、存在重复元素
  • LeetCode 349、两个数组的交集

基于上述题目,体会哈希集合在【判断重复元素】以及【数组去重】上的应用。

  • LeetCode 1、两数之和
  • LeetCode 219、存在重复元素II
  1. 基于上述题目,体会哈希表在【下标查询】类型题目中的应用
  2. 另外,仔细比较 LeetCode 217、存在重复元素 和  LeetCode 219、存在重复元素II 两题,思考哈希集合和哈希表两者的相似之处和区别。
  • LeetCode 205、同构字符串

基于上述题目,体会哈希表在【元素配对】类型题目中的应用。

第十天(周三)

  • LeetCode 242、有效的字母异位词
  • LeetCode 387、字符串中的第一个唯一字符
  • LeetCode 409、最长回文串
  1. 基于上述题目,体会哈希表在【统计元素频率】类型题目中的应用。
  2. 另外,请思考:如果题目已经告诉你元素的范围一定是小写字母或一定是大写字母(如 LeetCode 242、有效的字母异位词  ),那么能否用一个长度为26的数组来代替哈希表【统计频率】的功能?
  3. 对于LeetCode 387、字符串中的第一个唯一字符 ,如果只使用哈希表来完成的话,需要用到两次遍历。能否使用队列来优化该过程,使得整个算法只需要一次遍历?

第十一天(周四)

前置基础知识:前缀和

  • LeetCode 303、区域和检索-数组不可变
  • LeetCode 1588、所有奇数长度子数组的和
  • LeetCode 724、寻找数组的中心下标

第十二天(周五)

  • LeetCode 560、和为 K 的子数组
  • LeetCode 1248、统计「优美子数组」

第十三天(周六)

  • LeetCode 49、字母异位词分组
  • LeetCode 36、有效的数独
  • LeetCode 146、LRU缓存

第十四天(周日)

  • LeetCode 238、 除自身以外数组的乘积
  • LeetCode 304、二维区域和检索 - 矩阵不可变
  • LeetCode 1124、表现良好的最长时间段
  • LeetCode 23、合并K个升序链表(优先队列思路)

第十五天(周一)

  • LeetCode 88、合并两个有序数组
  • LeetCode 26、删除有序数组中的重复项
  • LeetCode 80、删除有序数组中的重复项II
  • LeetCode 319、灯泡开关

第十六天(周二)

  • LeetCode 9 、回文数
  • LeetCode 125、验证回文串
  • LeetCode 680、验证回文串II
  • LeetCode 292、Nim 游戏

第十七天(周三)

  • LeetCode 455、分发饼干
  • LeetCode 860、柠檬水找零
  • LeetCode 605、种花问题
  • LeetCode 122 、买卖股票的最佳时机 II(贪心解法)

第十八天(周四)

  • LeetCode 452、用最少数量的箭引爆气球
  • LeetCode 435、无重叠区间
  • LeetCode 402 、移掉 K 位数字

第十九天(周五)

  • LeetCode 1025、除数博弈
  • LeetCode 15、三数之和
  • LeetCode 16、最接近三数之和
  • LeetCode 18、四数之和

第二十天(周六)

  • LeetCode167、两数之和II- 输入有序数组
  • LeetCode 11、盛水最多的容器
  • LeetCode 61、旋转链表
  • LeetCode 142、环形链表II

第二十一天(周日)

  • LeetCode 881、救生艇
  • LeetCode 134 、加油站
  • LeetCode 55 、跳跃游戏
  • LeetCode 135、分发糖果

第二十二天(周一)

  • LeetCode 136、只出现一次的数字
  • LeetCode 137、只出现一次的数字 II
  • LeetCode 260、只出现一次的数字 III
  • LeetCode 169、多数元素

第二十三天(周二)

  • LeetCode 50、Pow(x,n)
  • LeetCode 8、字符串转换整数 (atoi)
  • LeetCode 43、字符串相乘

第二十四天(周三)

在排序数组中进行二分查找

  • LeetCode 704、二分查找
  • LeetCode 189、轮转数组
  • LeetCode 33、搜索旋转排序数组
  • LeetCode 81、搜索旋转排序数组II
  1. 上述题目是最基本的二分查找题目,一定要掌握。由于排序数组具有单调性的性质,所以是二分查找的一个非常重点的应用场景。
  2. 二分查找通常存在两种模板:左闭右闭和左闭右开。注意比较两种模板的细微差别,以及每一次二分查找退出循环时,指针left和right的情况和位置。
  3. 循环中的判断语句需要尤其注意,这将直接决定退出循环时left指向哪一个元素。
  4. 上面的题目数量虽然多,但思考逻辑和代码基本上都是一样,一通百通,一口气拿下全部题目。

第二十五天(周四)

在数字中进行二分

  • LeetCode278、第一个错误版本
  • LeetCode 69、x 的平方根
  • LeetCode367、有效的完全平方数
  1. 因为数字天然地呈现出递增的性质,因此在数字中进行二分查找,和在排序数组中进行二分查找的思路是类似的。
  2. 要注意指针left和right的初始化,和在数组中不完全一样。
  3. 要注意不同题目中,循环中判断条件使用。

第二十六天(周五)

在二维矩阵中进行二分

  • LeetCode 74、搜索二维矩阵
  • LeetCode 240、搜索二维矩阵 II
  1. 二维矩阵的二分查找,可能会涉及到索引线映射的技巧,即通过公式k = i * m + j把二维索引i和j转换为一维索引k, 然后再对k来使用标准二分查找即可。
  2. 对于 LeetCode 240、搜索二维矩阵 II 这题,直接使用LeetCode 74、搜索二维矩阵的方法肯定也能够完成,但可以思考能否使用时间复杂度更低的双指针算法来完成。

在利用问题的二段性进行二分

  • LeetCode 162、寻找峰值
  • LeetCode 852、山脉数组的顶峰索引
  1. 上述题目体现了二分查找的适用情况是二段性,即所需要的答案ans能够把数轴分成两个部分。前面出现的单调性,本质上也是二段性中的一种。
  2. 这些题目属于二分查找中最难的那档题目之一,是因为循环中的判断语句不好写,或是需要自己实现用来判断的函数,但本质上仍可以套用二分查找的模板。

第二十七天(周六)

滑动窗口(长度可变)

  • LeetCode 3、无重复字符的最长子串
  • LeetCode 209、长度最小的子数组
  • LeetCode 1695、删除子数组的最大得分
  • LeetCode 76、最小覆盖子串
  1. 基于上述题目,体会【长度可变滑动窗口】类型题目的基本思路,可以直接套用模板,请多多体会。虽然题目略多,但本质上都很相似,只需要修改少数代码即可完成。
  2. 【滑动窗口】应该称之为一种技巧更合适,本质上是一种特殊的【同向双指针】算法,但由于过于其使用频率过高,所以才有了滑窗这个名字。
  3. 很多滑窗的题目都会用到哈希表来辅助实现算法,哈希表一般作为【统计元素频率】的作用出现,因此练习滑窗的题目也可以提高你对哈希表的熟练度。

第二十八天(周日)

滑动窗口(长度不可变、固定的)

  • LeetCode 643、子数组最大平均数 I
  • LeetCode 438、找到字符串中所有字母异位词
  • LeetCode 567、字符串的排列
  • LeetCode 239、滑动窗口最大值
  1. 上述题目均为【长度不可变滑动窗口】类型的题目。其实这类题目往往比【长度可变滑动窗口】更加简单,因为只需要始终维持窗口的左右边界之差为一个定值即可,因此在代码实现上更为简单。
  2. 【长度不可变滑动窗口】类型的题目可能有简单题,相信在已经掌握了【长度可变滑动窗口】类型之后,这些题目也可以迎刃而解。注意比较两者的异同。
  3. 本类题目也可以直接套用模板,请多多体会。

第二十九天(周一)

  • LeetCode 206、反转链表
  • LeetCode 200、岛屿数量
  • LeetCode 695、岛屿的最大面积
  • LeetCode 463、岛屿的周长

第三十天(周二)

  • LeetCode 56、合并区间
  • LeetCode 148、排序链表
  • LeetCode 23、合并K个升序链表(归并思路)
  • LeetCode 4、寻找两个正序数组的中位数

第三十一天(周三)

  • LeetCode 179、最大数
  • LeetCode 215、数组中的第 K 个最大元素

第三十二天(周四)

子集问题&&排列问题

  • LeetCode 78、子集
  • LeetCode 90、子集II
  • LeetCode 46、全排列
  • LeetCode 47、全排列II

第三十三天(周五)

组合问题

  • LeetCode 39、组合总和
  • LeetCode 40、组合总和II
  • LeetCode 77、组合
  • LeetCode 17、电话号码的组合

第三十四天(周六)

棋盘问题

  • LeetCode 51、N 皇后
  • LeetCode 37、解数独
  • LeetCode 37、解数独(位运算法)

第三十五天(周日)

分割问题

  • LeetCode 93、复原 IP 地址
  • LeetCode 131、分割回文串

第三十六天(周一)

  • 二叉树的前序中序后序统一迭代法
  • LeetCode 102、二叉树的层序遍历
  • LeetCode 103、二叉树的锯齿形层序遍历
  • LeetCode 105、从前序与中序遍历序列构造二叉树

第三十七天(周二)

  • LeetCode 226、翻转二叉树
  • LeetCode 654 、最大二叉树
  • LeetCode 104、二叉树的最大深度
  • LeetCode 111 、二叉树的最小深度

第三十八天(周三)

  • LeetCode 199、二叉树的右视图
  • LeetCode 114、二叉树展开为链表
  • LeetCode 222 、完全二叉树的节点个数
  • LeetCode 236、二叉树的最近公共祖先

第三十九天(周四)

  • LeetCode 98、验证二叉搜索树
  • LeetCode 530、二叉搜索树的最小绝对差
  • LeetCode 235、二叉搜索树的最近公共祖先
  • LeetCode 538、把二叉搜索树转换为累加树

第四十天(周五)

  • LeetCode 1603、设计停车系统
  • LeetCode 433、最小基因变化

第四十一天(周六)

  • LeetCode 347、前 K 个高频元素
  • LeetCode 692、前 K 个高频单词
  • LeetCode 703、数据流中的第 K 大元素

第四十二天(周日)

  1. 注意比较DFS和BFS的异同。

  2. 相同之处:这两种算法都属于在树形结构或者图的搜索算法,能够访问所有的节点/位置

  3. 不同之处:

    1. DFS像侦察兵一样一直优先往深处搜索;BFS像军队一样铺展开来搜索
    2. DFS通常需要借助用递归实现,本质上是用到了编译栈;BFS通常需要借助队列来辅助实现
    3. BFS有层的概念(level),有时候也称为波纹法,通常可以用来搜寻最短路径
    4. 对于二叉树而言,DFS有先序、中序、后序三种遍历方式,但对于图而言通常没有这种分类;BFS在二叉树中也称为层序遍历。
  4. 图可以有多用多种方式来表示,譬如二维矩阵、邻接矩阵、邻接表等等,但本质上都大同小异。不要拘泥于图的表示形式,重点还是要理解DFS和BFS的过程以及万能模板。

  5. DFS和BFS的应用很多,不仅仅在这种显式的图的问题中可以用到,也可以在一些生成问题用到。这是因为可以将字符串/数组的生成过程写成一个树形结构,要注意融会贯通。

  • 图基础知识
  • LeetCode 743、网络延迟时间
  • LeetCode 207、课程表
  • LeetCode 684、冗余连接

第四十三天(周一)

动态规划(序列DP)

入门问题(理解DP基础概念)

  • LeetCode 509、斐波那契数
  • LeetCode 70、爬楼梯
  1. 斐波那契数列是一个非常好的题目,既与递归有关,也与DP有关。可以从这个简单问题,思考递归与DP的内在关联。
  2. 递归往往是从后往前计算
  3. DP往往是从前往后计算
  4. 用DP解题,一般要思考三个重要问题。
  5. DP数组的定义是什么?
  6. 动态转移方程是什么?
  7. 如何对DP数组进行初始化?
  8. 解答了这三个问题,代码基本上呼之欲出。千万不要拘泥于复杂的定义,要重理解而轻概念。

路径问题

  • LeetCode 62、不同路径
  • LeetCode 63、不同路径II






请到「今天看啥」查看全文