# 算法和数据结构体系学习班
# 第1节 复杂度和二分法
- 认识时间复杂度
- 选择排序
- 冒泡排序
- 插入排序
- 三种排序复杂度分析来强化时间复杂度认识
- 额外空间复杂度
- 常数时间的估算方式
- 认识对数器
- 二分法及其扩展题目
- 有序数组中找到>=num最左的位置
- 有序数组中找到<=num最右的位置
- 局部最小值问题
# 第2节 异或运算相关面试题
- 认识异或运算及其性质
- 如何不用额外变量交换两个数
- 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到这种数
- 怎么把一个int类型的数,提取出最右侧的1来
- 一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到这两种数
- 一个数组中有一种数出现K次,其他数都出现了M次,M > 1, K < M。找到出现了K次的数,要求,额外空间复杂度O(1),时间复杂度O(N)
# 第3节 基础数据结构
- 反转单双链表
- 删除单链表的给定值问题
- 双向链表实现栈和队列
- 数组实现栈
- 环形数组实现队列
- 含有getMin方法的栈
- 如何用栈实现队列
- 如何用队列实现栈
- 递归在系统上的实现
- 递归的脑图分析方式
- 递归的时间复杂度分析(Master公式)
- 哈希表的使用
- 有序表的使用
# 第4节 归并排序
- 归并排序的递归实现
- 归并排序的非递归实现
- 用归并排序解决数组小和问题
- 用归并排序解决数组逆序对问题
- 用归并排序解决在数组中左数>2*右数的个数问题
# 第5节 归并排序附加题、随机快速排序
- 用归并排序解决leetcode的count of range sum问题
- 快排的partition过程
- 荷兰国旗问题
- 随机快排的递归实现
- 随机快排的非递归实现
# 第6节 堆和堆排序
- 比较器的用法
- 堆结构的实现
- 堆排序
- 堆排序时间复杂度分析
- 从顶向下建堆 VS 从底向上建堆
- 对每个元素排序后移动的距离一定不超过k的数组进行排序
# 第7节 加强堆
- 最大线段重合问题
- 利用反向索引表实现功能更强大的堆(加强堆)
- 电商抽奖问题(加强堆练习题)
# 第8节 前缀树、不基于比较的排序、排序稳定性
- 前缀树的实现
- 基于比较的排序 VS 不基于比较的排序
- 计数排序的实现
- 基数排序的实现
- 排序算法的稳定性
# 第9节 排序总结、链表相关面试题
- 排序算法大总结
- 学习排序算法中常见的坑
- 工程上对排序改进的常见方向
- 链表问题在笔试上和面试上的解题方法论
- 链表问题常见的解题技巧
- 判断链表是否是回文结构
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 克隆带有随机指针的链表
- 链表相交的一系列问题
# 第10节 二叉树基本算法(上)
- 二叉树的三种序
- 证明X节点的祖先节点是两个集合的交集
- 二叉树的递归遍历
- 二叉树的非递归遍历
- 实现二叉树的按层遍历
- 二叉树的序列化和反序列化
- leetcode的Encode N-ary Tree to Binary Tree问题
# 第11节 二叉树基本算法(下)
- 如何设计一个打印整棵树的打印函数
- 求二叉树最宽的层有多少个节点
- 返回X节点的后继节点
- 判断二叉树是否是搜索二叉树
- 判断二叉树是否是完全二叉树
- 折纸问题
# 第12节 二叉树的递归套路
- 判断是不是平衡二叉树
- 判断是不是满二叉树
- 判断是不是搜索二叉树
- 二叉树中最大的二叉搜索子树的大小
- 二叉树中最大的二叉搜索子树的头节点
- 给定一棵二叉树的头节点head,和另外两个节点a和b,返回a和b的最低公共祖先
- 二叉树的最大距离
- 派对的最大快乐值
# 第13节 贪心算法(上)
- 贪心算法介绍和证明
- 拼接字典序最小的字符串问题
- 用对数器破解贪心算法题目
# 第14节 贪心算法(下)
- 街道点灯问题
- 分金条问题
- 会议室最大使用问题
- leetcode的IPO问题
# 第15节 并查集及其相关题目
- 并查集讲解和实现
- 并查集应用:岛问题
# 第16节 图
- 图的数据结构
- 图的bfs
- 图的dfs
- 拓扑排序
- Kruskal算法
- Prim算法
- Dijkstra算法
# 第17~23节 从暴力尝试到动态规划系列大课
- 打印n层汉诺塔从最左边移动到最右边的全部过程
- 打印一个字符串的全部子序列
- 打印一个字符串的全部子序列,要求不要出现重复字面值的子序列
- 打印一个字符串的全部排列
- 打印一个字符串的全部排列,要求不要出现重复的排列
- 不申请额外结构只用递归函数逆序一个栈
- 数字串转化为字符串问题
- 背包问题
- 纸牌问题
- N皇后问题
- 机器人行进问题的动态规划
- 一系列类似背包问题的动态规划
- 纸牌游戏问题动态规划
- 数字串转化为字符串问题动态规划
- 最长公共子序列问题动态规划
- 贴纸分解问题动态规划
- 泡咖啡问题动态规划
- 象棋走马问题动态规划
- 最短路径和问题动态规划
- 找零方法数问题动态规划
# 第24~25节 窗口更新结构和单调栈结构
- 窗口内最大值和最小值的更新结构
- 滑动窗口最大值问题
- 满足条件的子数组问题
- 单调栈结构
- 正数数组中子数组累加和乘最小值尽量大问题
# 第26节 由斐波那契数列讲述矩阵快速幂技巧
- 斐波那契数列
- 上楼梯问题
- 生母牛问题
- 01字符串满足条件个数问题
# 第27节 KMP算法
- KMP算法
- 包含子树问题
- 互为旋转词问题
# 第28节 Manacher算法
- Manacher算法
- 结尾添加最少字符让整体成为回文串
# 第29节 bfprt算法、蓄水池算法
- 改写快速排序找到数组最小的第K个数
- bfprt算法
- 蓄水池算法
# 第30节 Morris遍历
- Morris遍历原理和实现
- 求二叉树的最小高度额外空间复杂度O(1)的实现
# 第31节 线段树
- 线段树讲解和实现
- 俄罗斯方块每次掉落最大高度问题
# 第32节 IndexTree、AC自动机
- IndexTree
- 二维IndexTree
- AC自动机的原理和实现
# 第35~37节 有序表(上、中、下)
- 有序表的原理
- 平衡搜索二叉树
- 平衡搜索二叉树的右旋和左旋
- AVL树的原理和实现
- SB树的原理和实现
- 跳表的原理和实现
- 红黑树
- leetcode的count of range sum用有序表的解法
- 滑动窗口中位数的有序表解法
- 设计一个set(index, value)和get(index)都很快的结构
- 有序表总结
# 第38节 利用对数器找规律、打表技巧在面试中的应用
- 买苹果的最少袋子问题
- 牛羊吃草问题
- 连续数字累和能否凑足sum
# 第38节 矩形coding题目的宏观调度技巧
- 旋转正方形矩阵问题
- 旋转打印矩阵问题
- 打印星号图像问题
- zigzag打印矩阵问题
# 第39节 卡特兰数
- N个节点的二叉树结构数问题
- 要求任意前缀串中1比0多的字符串数量问题
- 得到N个节点的所有不同的二叉树结构
# 第39节 区间划分中的不回退现象
- 牛牛分田地问题
# 第40节 子数组达到规定累加和的最大长度系列问题(数组三连)
- 正数数组的得到累加和为sum的最大子数组长度
- 一般数组的得到累加和为sum的最大子数组长度
- 一般数组的得到累加和为<=sum的最大子数组长度
# 第41~42节 四边形不等式技巧(上、下)
- 邮局问题
- 画家问题
- 扔蛋问题
# 第43节 状态压缩的动态规划(上、下)
- Leetcode CanIWin问题
- TSP问题
- 贴瓷砖问题
# 第44~45节 后缀数组
- 后缀数组讲解和实现
- leetcode的CreateMaxinumNumber问题
# 第46~47节 动态规划猜法中和外部信息简化的相关问题(上、下)
- 打气球问题(Burst Balloons)
- 消箱子问题(Remove Boxes)
- 打印机最小转数问题(Strange Printer)
- 恢复原序列的方法数(Restore Ways)
- 相邻字符最大消除问题(Delete Adjacent Same Character)