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
“”
- 基于上述题目,体会哈希表在【下标查询】类型题目中的应用
- 另外,仔细比较 LeetCode 217、存在重复元素 和 LeetCode 219、存在重复元素II 两题,思考哈希集合和哈希表两者的相似之处和区别。
- LeetCode 205、同构字符串
“基于上述题目,体会哈希表在【元素配对】类型题目中的应用。
”
第十天(周三)
- LeetCode 242、有效的字母异位词
- LeetCode 387、字符串中的第一个唯一字符
- LeetCode 409、最长回文串
“”
- 基于上述题目,体会哈希表在【统计元素频率】类型题目中的应用。
- 另外,请思考:如果题目已经告诉你元素的范围一定是小写字母或一定是大写字母(如 LeetCode 242、有效的字母异位词 ),那么能否用一个长度为26的数组来代替哈希表【统计频率】的功能?
- 对于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
“”
- 上述题目是最基本的二分查找题目,一定要掌握。由于排序数组具有单调性的性质,所以是二分查找的一个非常重点的应用场景。
- 二分查找通常存在两种模板:左闭右闭和左闭右开。注意比较两种模板的细微差别,以及每一次二分查找退出循环时,指针left和right的情况和位置。
- 循环中的判断语句需要尤其注意,这将直接决定退出循环时left指向哪一个元素。
- 上面的题目数量虽然多,但思考逻辑和代码基本上都是一样,一通百通,一口气拿下全部题目。
第二十五天(周四)
在数字中进行二分
- LeetCode278、第一个错误版本
- LeetCode 69、x 的平方根
- LeetCode367、有效的完全平方数
“”
- 因为数字天然地呈现出递增的性质,因此在数字中进行二分查找,和在排序数组中进行二分查找的思路是类似的。
- 要注意指针left和right的初始化,和在数组中不完全一样。
- 要注意不同题目中,循环中判断条件使用。
第二十六天(周五)
在二维矩阵中进行二分
- LeetCode 74、搜索二维矩阵
- LeetCode 240、搜索二维矩阵 II
“”
- 二维矩阵的二分查找,可能会涉及到索引线映射的技巧,即通过公式k = i * m + j把二维索引i和j转换为一维索引k, 然后再对k来使用标准二分查找即可。
- 对于 LeetCode 240、搜索二维矩阵 II 这题,直接使用LeetCode 74、搜索二维矩阵的方法肯定也能够完成,但可以思考能否使用时间复杂度更低的双指针算法来完成。
在利用问题的二段性进行二分
- LeetCode 162、寻找峰值
- LeetCode 852、山脉数组的顶峰索引
“”
- 上述题目体现了二分查找的适用情况是二段性,即所需要的答案ans能够把数轴分成两个部分。前面出现的单调性,本质上也是二段性中的一种。
- 这些题目属于二分查找中最难的那档题目之一,是因为循环中的判断语句不好写,或是需要自己实现用来判断的函数,但本质上仍可以套用二分查找的模板。
第二十七天(周六)
滑动窗口(长度可变)
- LeetCode 3、无重复字符的最长子串
- LeetCode 209、长度最小的子数组
- LeetCode 1695、删除子数组的最大得分
- LeetCode 76、最小覆盖子串
“”
- 基于上述题目,体会【长度可变滑动窗口】类型题目的基本思路,可以直接套用模板,请多多体会。虽然题目略多,但本质上都很相似,只需要修改少数代码即可完成。
- 【滑动窗口】应该称之为一种技巧更合适,本质上是一种特殊的【同向双指针】算法,但由于过于其使用频率过高,所以才有了滑窗这个名字。
- 很多滑窗的题目都会用到哈希表来辅助实现算法,哈希表一般作为【统计元素频率】的作用出现,因此练习滑窗的题目也可以提高你对哈希表的熟练度。
第二十八天(周日)
滑动窗口(长度不可变、固定的)
- LeetCode 643、子数组最大平均数 I
- LeetCode 438、找到字符串中所有字母异位词
- LeetCode 567、字符串的排列
- LeetCode 239、滑动窗口最大值
“”
- 上述题目均为【长度不可变滑动窗口】类型的题目。其实这类题目往往比【长度可变滑动窗口】更加简单,因为只需要始终维持窗口的左右边界之差为一个定值即可,因此在代码实现上更为简单。
- 【长度不可变滑动窗口】类型的题目可能有简单题,相信在已经掌握了【长度可变滑动窗口】类型之后,这些题目也可以迎刃而解。注意比较两者的异同。
- 本类题目也可以直接套用模板,请多多体会。
第二十九天(周一)
- 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 大元素
第四十二天(周日)
“”
注意比较DFS和BFS的异同。
相同之处:这两种算法都属于在树形结构或者图的搜索算法,能够访问所有的节点/位置
不同之处:
“”
- DFS像侦察兵一样一直优先往深处搜索;BFS像军队一样铺展开来搜索
- DFS通常需要借助用递归实现,本质上是用到了编译栈;BFS通常需要借助队列来辅助实现
- BFS有层的概念(level),有时候也称为波纹法,通常可以用来搜寻最短路径
- 对于二叉树而言,DFS有先序、中序、后序三种遍历方式,但对于图而言通常没有这种分类;BFS在二叉树中也称为层序遍历。
图可以有多用多种方式来表示,譬如二维矩阵、邻接矩阵、邻接表等等,但本质上都大同小异。不要拘泥于图的表示形式,重点还是要理解DFS和BFS的过程以及万能模板。
DFS和BFS的应用很多,不仅仅在这种显式的图的问题中可以用到,也可以在一些生成问题用到。这是因为可以将字符串/数组的生成过程写成一个树形结构,要注意融会贯通。
- 图基础知识
- LeetCode 743、网络延迟时间
- LeetCode 207、课程表
- LeetCode 684、冗余连接
第四十三天(周一)
动态规划(序列DP)
入门问题(理解DP基础概念)
- LeetCode 509、斐波那契数
- LeetCode 70、爬楼梯
“”
- 斐波那契数列是一个非常好的题目,既与递归有关,也与DP有关。可以从这个简单问题,思考递归与DP的内在关联。
- 递归往往是从后往前计算
- DP往往是从前往后计算
- 用DP解题,一般要思考三个重要问题。
- DP数组的定义是什么?
- 动态转移方程是什么?
- 如何对DP数组进行初始化?
- 解答了这三个问题,代码基本上呼之欲出。千万不要拘泥于复杂的定义,要重理解而轻概念。
路径问题
- LeetCode 62、不同路径
- LeetCode 63、不同路径II
“”
- 路径问题是一类非常典型的序列DP问题,其过程简单、思路直接、变式不多,不同路径问题的基本思路相似,非常适合入门DP算法的学习。
- 以 LeetCode 62、不同路径为种子题的二维路径问题,本质上大同小异,仅需在种子题的加以简单的修改,即可完成多道题目。
- 对于路径问题而言,移动方向往往是具有限制条件的,譬如从矩阵的左上方移动到右下方,只能向下和向右移动等等,如果不加这种限制条件,那么较难使用DP算法解题,而应该转而考虑DFS/BFS等搜寻算法来完成。
第四十四天(周二)
最长递增子序列(LIS)问题
- LeetCode 300、最长递增子序列
- LeetCode 673、最长递增子序列的个数
- LeetCode 334、递增的三元组
“”
- LIS问题是非常经典的序列DP问题,其DP解法不难理解,同时属于高频考题,强烈建议掌握。
- LIS问题还存在更优的贪心+二分查找的解法,属于较难想到、较难理解的思路,感兴趣且学有余力的话可以学习一下。通常而言,DP解法已经足够解决10^4这个数据量级的题目了。
最长公共子序列(LCS)问题
- LeetCode 718、最长重复子数组(HJ75. 公共子串计算)
- LeetCode 1143、最长公共子序列
“”
- LCS问题的难点在于dp数组的构建与定义较难想到。其实用一个二维dp数组来表示两个序列之间的关系,这是一种非常常用的技巧,但如果从来没有见过这样的做法是很难想到应该这样完成的。
- LeetCode 1143、最长公共子序列和 LeetCode 718、最长重复子数组两道题之间的差别仅仅在于序列是否可以连续地取,在思路和代码上是非常类似的。
- 如果觉得理解上有些困难,那么这类题是可以直接背诵代码的,因为代码不长。
第四十五天(周三)
动态规划(状态DP)
- LeetCode 188、买卖股票的最佳时机 IV
- LeetCode 121、买卖股票的最佳时机
- LeetCode 123、买卖股票的最佳时机 III
- LeetCode 122、买卖股票的最佳时机 II
- LeetCode 309、最佳买卖股票时机含冷冻期
- LeetCode 714、买卖股票的最佳时机含手续费
“”
- 股票问题是非常经典的一类状态DP问题。所谓状态DP,就是dp数组通常定义为一个二维数组,而第i个位置,通常包括多种不同的状态,而并非像序列DP那样只是个单一的值。
- 状态的定义比较麻烦,稍微有点反直觉,一般来说会将买入的状态设置为负数,表示已经花费的金钱。
- 该系列我会讲解一个模板解法
第四十六天(周四)
- 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、平衡二叉树
分类:
算法 / 数据结构
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库