labuladong算法学习进展

学习目标:

  • labuladong的算法秘籍学习
  • csdn记录学习进展
  • 76.最小覆盖子串

学习内容:

  1. 数组
  2. 链表
  3. 前缀和
  4. 差分数组
  5. 双指针
  6. 二分搜索,左边界,右边界
  7. 递归反转链表。反转整个链表;反转链表前n个元素;反转链表的m-n个元素。
  8. 队列和栈的题⽬并不是很多,队列主要⽤在 BFS 算法,栈主要⽤在括号相关的问题。
  9. 单调栈。下一个更大的元素,下一个更大的元素的距离
  10. BST
  11. 图:邻接矩阵,邻接表
  12. 快速排序、归并排序、拓扑排序(DFS\BFS)
  13. 二分图判定
  14. Union-Find算法,并查集相关算法。
  15. 回溯算法解决子集、排列、组合问题

知识点:

  • 单调栈就是栈,只不过每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)
  • 单调队列同理。
  • 图论中特有的度(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++;
 			// 进⾏窗⼝内数据的⼀系列更新
 			...
 		}
 	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值