“
1、LeetCode 题目太多,全部刷完肯定不是最好最有效的方式,其中涉及到的基本知识点来来回回就那些,同时有非常多的类似题,所以刷经典题,掌握这些经典题是最有效的学习方式。
2、从算法训练营第一期开始到现在的第十二期,吴师兄整理和迭代了非常多的刷题顺序,经过这两年的同学们的反馈,终于整理出一份我认为是最适合新手小白转码同学的 LeetCode 刷题顺序。
3、本刷题顺序涵盖了 205 道算法题,如果你的自学能力强,每天能够投入 2 小时的刷题时间,两个月左右是可以做到完完整整的全部刷完。
4、视频学习课程:
玩转 100 道高频算法题!
”
第一天(周一)
“
1、参考网站:https://www.runoob.com/
2、只需要掌握相关编程语言的基础语法、对象初始化、基本数据类型、变量类型、循环语句、条件语句这些知识即可开始刷题。
”
第二天(周二)
数组
“
数组作为最简单一个数据结构,单独考察的概率非常低,它往往是结合其它算法进行考察的。通过下面的题目帮助大家理解数组的一些基本操作。
”
第三天(周三)
链表
“
链表题目的一些知识点。
1、天然的具备递归性,递归的系统学习安排在第五周的内容
2、设置虚拟头结点,可以起到非常好的效果
”
-
-
-
-
LeetCode 19、删除链表的倒数第 N 个结点
第四天(周四)
链表
第五天(周五)
栈
“
1、体会栈在【括号配对】类型题目中的应用。
2、体会栈在【表达式求值】类型题目中的应用。
”
第六天(周六)
第七天(周日)
“
前置知识:单调栈。
”
第八天(周一)
-
-
-
-
LeetCode 373、查找和最小的 K 对数字
第九天(周二)
“
基于上述题目,体会哈希集合在【判断重复元素】以及【数组去重】上的应用。
”
“
-
基于上述题目,体会哈希表在【下标查询】类型题目中的应用
-
另外,仔细比较 LeetCode 217、存在重复元素 和 LeetCode 219、存在重复元素II 两题,思考哈希集合和哈希表两者的相似之处和区别。
”
“
基于上述题目,体会哈希表在【元素配对】类型题目中的应用。
”
第十天(周三)
-
-
LeetCode 387、字符串中的第一个唯一字符
-
“
-
基于上述题目,体会哈希表在【统计元素频率】类型题目中的应用。
-
另外,请思考:如果题目已经告诉你元素的范围一定是小写字母或一定是大写字母(如 LeetCode 242、有效的字母异位词 ),那么能否用一个长度为26的数组来代替哈希表【统计频率】的功能?
-
对于LeetCode 387、字符串中的第一个唯一字符 ,如果只使用哈希表来完成的话,需要用到两次遍历。能否使用队列来优化该过程,使得整个算法只需要一次遍历?
”
第十一天(周四)
“
前置基础知识:前缀和
”
-
-
LeetCode 1588、所有奇数长度子数组的和
-
第十二天(周五)
第十三天(周六)
第十四天(周日)
-
-
LeetCode 304、二维区域和检索 - 矩阵不可变
-
-
LeetCode 23、合并K个升序链表(优先队列思路)
第十五天(周一)
-
-
-
LeetCode 80、删除有序数组中的重复项II
-
第十六天(周二)
第十七天(周三)
-
-
-
-
LeetCode 122 、买卖股票的最佳时机 II(贪心解法)
第十八天(周四)
第十九天(周五)
第二十天(周六)
-
LeetCode167、两数之和II- 输入有序数组
-
-
-
第二十一天(周日)
第二十二天(周一)
-
-
-
LeetCode 260、只出现一次的数字 III
-
第二十三天(周二)
-
-
LeetCode 8、字符串转换整数 (atoi)
-
第二十四天(周三)
在排序数组中进行二分查找
“
-
上述题目是最基本的二分查找题目,一定要掌握。由于排序数组具有单调性的性质,所以是二分查找的一个非常重点的应用场景。
-
二分查找通常存在两种模板:左闭右闭和左闭右开。注意比较两种模板的细微差别,以及每一次二分查找退出循环时,指针left和right的情况和位置。
-
循环中的判断语句需要尤其注意,这将直接决定退出循环时left指向哪一个元素。
-
上面的题目数量虽然多,但思考逻辑和代码基本上都是一样,一通百通,一口气拿下全部题目。
”
第二十五天(周四)
在数字中进行二分
“
-
因为数字天然地呈现出递增的性质,因此在数字中进行二分查找,和在排序数组中进行二分查找的思路是类似的。
-
要注意指针left和right的初始化,和在数组中不完全一样。
-
”
第二十六天(周五)
在二维矩阵中进行二分
“
-
二维矩阵的二分查找,可能会涉及到索引线映射的技巧,即通过公式k = i * m + j把二维索引i和j转换为一维索引k, 然后再对k来使用标准二分查找即可。
-
对于 LeetCode 240、搜索二维矩阵 II 这题,直接使用LeetCode 74、搜索二维矩阵的方法肯定也能够完成,但可以思考能否使用时间复杂度更低的双指针算法来完成。
”
在利用问题的二段性进行二分
“
-
上述题目体现了二分查找的适用情况是二段性,即所需要的答案ans能够把数轴分成两个部分。前面出现的单调性,本质上也是二段性中的一种。
-
这些题目属于二分查找中最难的那档题目之一,是因为循环中的判断语句不好写,或是需要自己实现用来判断的函数,但本质上仍可以套用二分查找的模板。
”
第二十七天(周六)
滑动窗口(长度可变)
“
-
基于上述题目,体会【长度可变滑动窗口】类型题目的基本思路,可以直接套用模板,请多多体会。虽然题目略多,但本质上都很相似,只需要修改少数代码即可完成。
-
【滑动窗口】应该称之为一种技巧更合适,本质上是一种特殊的【同向双指针】算法,但由于过于其使用频率过高,所以才有了滑窗这个名字。
-
很多滑窗的题目都会用到哈希表来辅助实现算法,哈希表一般作为【统计元素频率】的作用出现,因此练习滑窗的题目也可以提高你对哈希表的熟练度。
”
第二十八天(周日)
滑动窗口(长度不可变、固定的)
-
-
LeetCode 438、找到字符串中所有字母异位词
-
-
“
-
上述题目均为【长度不可变滑动窗口】类型的题目。其实这类题目往往比【长度可变滑动窗口】更加简单,因为只需要始终维持窗口的左右边界之差为一个定值即可,因此在代码实现上更为简单。
-
【长度不可变滑动窗口】类型的题目可能有简单题,相信在已经掌握了【长度可变滑动窗口】类型之后,这些题目也可以迎刃而解。注意比较两者的异同。
-
”
第二十九天(周一)
第三十天(周二)
-
-
-
LeetCode 23、合并K个升序链表(归并思路)
-
第三十一天(周三)
-
-
LeetCode 215、数组中的第 K 个最大元素
第三十二天(周四)
子集问题&&排列问题
第三十三天(周五)
组合问题
第三十四天(周六)
棋盘问题
第三十五天(周日)
分割问题
第三十六天(周一)
-
-
-
-
LeetCode 105、从前序与中序遍历序列构造二叉树
第三十七天(周二)
第三十八天(周三)
第三十九天(周四)
-
-
-
LeetCode 235、二叉搜索树的最近公共祖先
-
LeetCode 538、把二叉搜索树转换为累加树
第四十天(周五)
第四十一天(周六)
-
-
-
LeetCode 703、数据流中的第 K 大元素
第四十二天(周日)
“
-
-
相同之处:这两种算法都属于在树形结构或者图的搜索算法,能够访问所有的节点/位置
-
-
DFS像侦察兵一样一直优先往深处搜索;BFS像军队一样铺展开来搜索
-
DFS通常需要借助用递归实现,本质上是用到了编译栈;BFS通常需要借助队列来辅助实现
-
BFS有层的概念(level),有时候也称为波纹法,通常可以用来搜寻最短路径
-
对于二叉树而言,DFS有先序、中序、后序三种遍历方式,但对于图而言通常没有这种分类;BFS在二叉树中也称为层序遍历。
-
图可以有多用多种方式来表示,譬如二维矩阵、邻接矩阵、邻接表等等,但本质上都大同小异。不要拘泥于图的表示形式,重点还是要理解DFS和BFS的过程以及万能模板。
-
DFS和BFS的应用很多,不仅仅在这种显式的图的问题中可以用到,也可以在一些生成问题用到。这是因为可以将字符串/数组的生成过程写成一个树形结构,要注意融会贯通。
”
第四十三天(周一)
动态规划(序列DP)
入门问题(理解DP基础概念)
“
-
斐波那契数列是一个非常好的题目,既与递归有关,也与DP有关。可以从这个简单问题,思考递归与DP的内在关联。
-
-
-
-
-
-
-
解答了这三个问题,代码基本上呼之欲出。千万不要拘泥于复杂的定义,要重理解而轻概念。
”
路径问题
“