Leetcode 刷题顺序,看这一篇就够了!(第二版)

来源:https://mp.weixin.qq.com/s/APGE0k73n4Hk2bvyySWVDA

第一天(周一)

  • 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
  1. 路径问题是一类非常典型的序列DP问题,其过程简单、思路直接、变式不多,不同路径问题的基本思路相似,非常适合入门DP算法的学习。
  2. 以 LeetCode 62、不同路径为种子题的二维路径问题,本质上大同小异,仅需在种子题的加以简单的修改,即可完成多道题目。
  3. 对于路径问题而言,移动方向往往是具有限制条件的,譬如从矩阵的左上方移动到右下方,只能向下和向右移动等等,如果不加这种限制条件,那么较难使用DP算法解题,而应该转而考虑DFS/BFS等搜寻算法来完成。

第四十四天(周二)

最长递增子序列(LIS)问题

  • LeetCode 300、最长递增子序列
  • LeetCode 673、最长递增子序列的个数
  • LeetCode 334、递增的三元组
  1. LIS问题是非常经典的序列DP问题,其DP解法不难理解,同时属于高频考题,强烈建议掌握。
  2. LIS问题还存在更优的贪心+二分查找的解法,属于较难想到、较难理解的思路,感兴趣且学有余力的话可以学习一下。通常而言,DP解法已经足够解决10^4这个数据量级的题目了。

最长公共子序列(LCS)问题

  • LeetCode 718、最长重复子数组(HJ75. 公共子串计算)
  • LeetCode 1143、最长公共子序列
  1. LCS问题的难点在于dp数组的构建与定义较难想到。其实用一个二维dp数组来表示两个序列之间的关系,这是一种非常常用的技巧,但如果从来没有见过这样的做法是很难想到应该这样完成的。
  2. LeetCode 1143、最长公共子序列和 LeetCode 718、最长重复子数组两道题之间的差别仅仅在于序列是否可以连续地取,在思路和代码上是非常类似的。
  3. 如果觉得理解上有些困难,那么这类题是可以直接背诵代码的,因为代码不长。

第四十五天(周三)

动态规划(状态DP)

  • LeetCode 188、买卖股票的最佳时机 IV
  • LeetCode 121、买卖股票的最佳时机
  • LeetCode 123、买卖股票的最佳时机 III
  • LeetCode 122、买卖股票的最佳时机 II
  • LeetCode 309、最佳买卖股票时机含冷冻期
  • LeetCode 714、买卖股票的最佳时机含手续费
  1. 股票问题是非常经典的一类状态DP问题。所谓状态DP,就是dp数组通常定义为一个二维数组,而第i个位置,通常包括多种不同的状态,而并非像序列DP那样只是个单一的值。
  2. 状态的定义比较麻烦,稍微有点反直觉,一般来说会将买入的状态设置为负数,表示已经花费的金钱。
  3. 该系列我会讲解一个模板解法

第四十六天(周四)

  • LeetCode 120、三角形最小路径和
  • LeetCode 343、整数拆分
  • LeetCode 279、完全平方数
  • LeetCode 174、地下城游戏

第四十七天(周五)

  • LeetCode 5、最长回文子串
  • LeetCode 53、最大子数组和
  • LeetCode 516、最长回文子序列
  • LeetCode 718、最长重复子数组

第四十八天(周六)

  • LeetCode 322、零钱兑换
  • LeetCode 139、单词拆分
  • LeetCode 264、丑数II(动态规划)
  • LeetCode 72、编辑距离

打家劫舍问题

  • LeetCode 198、打家劫舍
  • LeetCode 213、打家劫舍II
  • LeetCode 337、打家劫舍III

第四十九天(周日)

动态规划(背包DP)

0-1背包

  • LeetCode 474、一和零
  • LeetCode 494、目标和
  • LeetCode 416、分割等和子集

完全背包

  • LeetCode 518、零钱兑换II

第五十天(周一)

  • 什么是字典树
  • LeetCode 208、实现Trie(前缀树)
  • LeetCode 211、添加与搜索单词 - 数据结构设计
  • LeetCode 648、单词替换
  • LeetCode 676、实现一个魔法字典

第五十一天(周二)

  • 什么是并查集
  • LeetCode 547、省份数量
  • LeetCode 200、岛屿数量(并查集解法)

第五十二天(周三)

  • LeetCode 445、两数相加II
  • LeetCode 1049、最后一块石头的重量II
  • LeetCode 322、零钱兑换(完全背包解法)
  • LeetCode 811、子域名访问次数

第五十三天(周四)

  • LeetCode 1109、航班预订统计
  • LeetCode 45、跳跃游戏II
  • LeetCode 376 、摆动序列
  • LeetCode 946、验证栈序列

第五十四天(周五)

  • LeetCode 231、2 的幂
  • LeetCode 268、丢失的数字
  • LeetCode 85、最大矩形
  • LeetCode 64、最小路径和

第五十五天(周六)

  • LeetCode 34、在排序数组中查找元素的第一个和最后一个位置
  • LeetCode 35、搜索插入位置
  • LeetCode 153、寻找旋转排序数组中的最小值
  • LeetCode 154、寻找旋转排序数组中的最小值 II

第五十六天(周日)

  • LeetCode 461、汉明距离
  • LeetCode 295、数据流中的中位数
  • LeetCode 297 、二叉树的序列化与反序列化
  • LeetCode 110、平衡二叉树
posted @ 2023-06-09 16:46  petercao  阅读(161)  评论(0编辑  收藏  举报