首页已经更新,希望能对大家有帮助。
说明:我和绝大多数同学一样,一边学习、一边总结。我会争取做更多的分享,给大家带来一些有用的知识,感谢大家一直以来的支持。
大家好,这里是一个《算法与数据结构》的入门级教程,适用于算法零基础和转行同学,不适合于准备算法竞赛。想传递的观点是:写逻辑清楚的代码,所以我写的代码一定经过了严格的思考,格式非常标准,不带有个人风格,不会为了缩减代码行数而少写一个空行和注释。在这里:
可以叫我 weiwei,在我力所能及且时间允许的情况下,我会尽可能回答我知道的问题。如果有不能及时回复的问题,可能是因为我没有看到站内通知,可以发邮件给我 [email protected] 。
我从 2019 年 9 月开始录制视频题解。最开始的时候,我会对着要讲的材料录好几遍。现在讲解知识点的时候写逐字稿。已经沉淀了很多视频,其实也算是一个小小的体系课程,现在罗列在这里,希望能够对大家有所帮助。
这个视频提到了时间复杂度是一个渐进概念,需要用动态的角度去理解。并且讲解了时间复杂度的严格定义(极限形式),以便大家理解时间复杂度的计算规则。并且还指出了:时间复杂度不是程序的运行时间;应该使用「空间换时间」,更多关注在优化「时间复杂度」。
这个视频介绍了如何写对二分查找算法,二分查找的细节虽然多,但只要我们掌握了正确的解题思路,并且多加练习、勤于思考、多做总结,写对二分查找的问题就不再困难。
下面的视频讲解了几道二分查找的例题,我们重点分析了题意和如何利用题目中给出的条件逐渐缩小搜索区间。
| 题目链接 | 力扣 | B 站 |
|---|---|---|
| 35. 搜索插入位置(简单) | (空缺) | B 站 |
| 34. 在排序数组中查找元素的第一个和最后一个位置(简单) | 力扣 | B 站 |
| 1095. 山脉数组中查找目标值(中等) | 力扣 | B 站 |
| 4. 寻找两个正序数组的中位数(困难) | 力扣 | B 站 |
我们通过「力扣」第 4 题(寻找两个正序数组的中位数)的分析,向大家介绍了这样的技巧:如果要找的目标元素的性质比较复杂,可以对这条性质取反,进而写出可以简单的可以缩减问题区间的逻辑语句。
「归并排序」和「快速排序」是非常重要的排序算法,深刻理解它们对于理解「递归」函数的运行机制有着非常大的帮助,同时它们也是「分治思想」的典型应用。「逆序对」和「荷兰国旗问题(颜色分类)」也是非常经典的算法问题。
| 题目链接 | 力扣 | B 站 |
|---|---|---|
| 《剑指 Offer》 51. 数组中的逆序对(困难) | 力扣 | B 站 |
| 315. 计算右侧小于当前元素的个数(困难) | 力扣 | B 站 |
计算「逆序对」完全就是按照「归并排序」的思路而来。
| 题目链接 | 力扣 | B 站 |
|---|---|---|
| 75. 颜色分类(中等) | 力扣 | B 站 |
在「颜色分类」问题的讲解中,我们向大家介绍了「循环不变量」,在编写代码的过程中,我们应该一直遵守所使用的变量的语义,在「程序执行前」「执行过程中」「执行结束」以后保持不变。遵守我们自己定义「循环不变量」是我们写对正确代码的重要方法。
| 题目链接 | 力扣 | B 站 |
|---|---|---|
| 41. 缺失的第一个正数(困难) | 力扣 | B 站 |
「缺失的第一个正数」是一个经典的算法问题,用到的思想是「原地哈希」,可以理解为是「桶排序」算法的特殊应用:一个萝卜一个坑,一个桶里只存放一个元素。要和大家强调的是,可以这样做是和输入数组的元素的数值密切相关。
「滑动窗口」问题是典型的应用「循环不变量」解决的问题,比较考验我们编码和调试的能力。
| 题目链接 | 力扣 | B 站 |
|---|---|---|
| 76. 最小覆盖子串(困难) | 力扣 | B 站 |
| 424. 替换后的最长重复字符(中等) | 力扣 | B 站 |
| 567. 字符串的排列(中等) | 力扣 | B 站 |
| 978. 最长湍流子数组(中等) | 力扣 | B 站 |
| 992. K 个不同整数的子数组(困难) | 力扣 | B 站 |
使用「栈」解决的问题,需要我们通过具体例子,发现解决它们正好符合「后进先出」的规律:
掌握下面这两个问题,离不开对具体例子的研究,进而归纳出一般规律。
| 题目链接 | 力扣 | B 站 |
|---|---|---|
| 84. 柱状图中最大的矩形(困难) | 力扣 | B 站 |
| 316. 去除重复字母(中等) | 力扣 | B 站 |
「栈」最为广泛的一种应用就是作为「递归」「深度优先遍历」「分治算法」的数据结构支持。
「并查集」这个数据结构目前来说在面试中出现比较少,如果是准备算法面试的朋友,可以跳过。
树的问题很多都可以使用「深度优先遍历」或者「广度优先遍历」去做。
| 题目链接 | 力扣 | B 站 |
|---|---|---|
| 105. 从前序与中序遍历序列构造二叉树(中等) | 力扣 | B 站 |
「回溯算法」其实就是对题目中所蕴含的「树形结构」执行一次 深度优先遍历。做这一类问题,在草稿
No open issues yet, or sync has not completed.