学习目标:
- labuladong的算法秘籍学习
- csdn记录学习进展
- 76.最小覆盖子串
学习内容:
- 数组
- 链表
- 前缀和
- 差分数组
- 双指针
- 二分搜索,左边界,右边界
- 递归反转链表。反转整个链表;反转链表前n个元素;反转链表的m-n个元素。
- 队列和栈的题⽬并不是很多,队列主要⽤在 BFS 算法,栈主要⽤在括号相关的问题。
- 单调栈。下一个更大的元素,下一个更大的元素的距离
- BST
- 图:邻接矩阵,邻接表
- 快速排序、归并排序、拓扑排序(DFS\BFS)
- 二分图判定
- Union-Find算法,并查集相关算法。
回溯算法
解决子集、排列、组合问题
知识点:
- 单调栈就是栈,只不过每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)
- 单调队列同理。
- 图论中特有的度(degree)的概念,在⽆向图中,「度」就是每个节点相连的边的条数。
- 出度,入度
- 图和多叉树最⼤的区别是,图是可能包含环的,你从图的某⼀个节点开始遍历,有可能⾛了⼀圈⼜回到这个
节点。所以,如果图包含环,遍历框架就要⼀个 visited 数组进⾏辅助 - 动态连通性编译器判断同⼀个变量的不同引⽤,⽐如社交⽹络中的朋友圈计算等等
学习进展:
2022年4月27日 通过XX遍历构造二叉树
- 105. 前序与中序遍历构造二叉树 (唯一)
- 106. 中序与后序遍历构造二叉树 (唯一)
- 889. 前序与后序遍历构造二叉树(多种结果)
- 归并排序
- 区间和-前缀和数组
二叉搜索树
- BST
- Binary Search Tree
- 左小右大
- 中序遍历结果是有序的
- BST算是数据结构领域的半壁江⼭,直接基于 BST 的数据结构有 AVL
树,红⿊树等等,拥有了⾃平衡性质,可以提供 logN 级别的增删查改效率;还有 B+ 树,线段树等结构都是
基于 BST 的思想来设计的。
图数据库:
https://zhuanlan.zhihu.com/p/50171330
https://www.zhihu.com/question/31529346
图论
- Kruskal最小生成树算法
- Prime 最小生成树算法
2022年4月26日 二叉树
- 前序、中序、后序
- 快排(前序)、归并(后序)
- 回溯、动态规划
- 遍历、递归
- 子树问题要考虑后序遍历来解决:遇到⼦树问题,⾸先想到的是给函数设置返回值,然后在后序位置做⽂章
- 116. 填充每个节点的下一个右侧节点指针
2022年4月25日
- 最小覆盖子串
- 870. 二分搜索,优先队列
- 二分搜索,寻找一个元素,寻找左边界,寻找右边界。
- 92.
递归反转链表中的一部分
- 队列和栈的题⽬并不是很多,队列主要⽤在 BFS 算法,栈主要⽤在括号相关的问题
-
单调栈
。下一个更大的元素,下一个更大的元素的距离 - 316.去除重复字母
pythonic:
https://www.zhihu.com/question/37751951/answer/73425339
- 146.
LRU
. Least Recently Used.哈希链表
- 460.
LFU
- 710.O(1)进行插入、删除、随机访问元素。借助哈希表实现。
- 295.数据流中的中位数
2022年4月24日
- 11点04分。数组、矩阵的
前缀和
- 11点17分。差分数组。公交车载客问题。
双指针分为左右指针、快慢指针两类
- 双指针,有序链表排序。
- 二叉堆,
k个有序链表排序
- 快慢指针,环判断,环起点查找,链表中点查找
- 双指针判断
两个链表是否相交
,p1 遍历链表AB,p2遍历链表 BA,p1和p2最后会同时达到相交节点c1。 - 快慢指针
原地修改数组
,删除有序数组重复元素。 - 双指针寻找字符串中的最长回文子字符串
labuladong滑动窗口算法框架
/* 滑动窗⼝算法框架 */
void slidingWindow(string s, string t) {
unordered_map<char, int> need, window;
for (char c : t) need[c]++;
int left = 0, right = 0;
int valid = 0;
while (right < s.size()) {
// c 是将移⼊窗⼝的字符
char c = s[right];
// 增⼤窗⼝
right++;
// 进⾏窗⼝内数据的⼀系列更新
...
/*** debug 输出的位置 ***/
printf("window: [%d, %d)\n", left, right);
/********************/
// 判断左侧窗⼝是否要收缩
while (window needs shrink) {
// d 是将移出窗⼝的字符
char d = s[left];
// 缩⼩窗⼝
left++;
// 进⾏窗⼝内数据的⼀系列更新
...
}
}
}