# 算法和数据结构体系学习班

# 第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)