算法与数据结构基础班

章节1: 认识复杂度、对数器、二分法与异或运算 (20节)

  • 什么是算法数据结构
  • 何为常数时间的操作
  • 常见的常数时间操作
  • 时间复杂度的意义
  • 选择排序
  • 冒泡排序
  • 插入排序
  • 额外空间复杂度
  • 面试、比赛、刷题中、一个问题的最优解是什么意思
  • 常见的时间复杂度
  • 算法和数据结构学习的大脉络
  • 什么叫对数器
  • 什么叫二分法
  • 在一个有序数组中,找=某个数的最左侧位置
  • 局部最小值
  • 认识异或运算
  • 如何不用额外变量交换两个数的值
  • 一个数组中有一种数出现了奇数次,其他数都出现了偶数次怎么找到这种数
  • 怎么把一个int类型的数,提取出最右侧1来
  • 一个数组中有一种数出现了奇数次,其他数都出现了偶数次怎么找到这两种数

章节2: 链表结构、栈、队列、递归行为、哈希表和有序表 (13节)

  • 单双向链表节点结构
  • 单双链表如何反转
  • 把给定值删除
  • java和c++在内存释放上的问题
  • 什么是栈和队列
  • 栈和队列的实际实现(双向链表实现)
  • 栈和队列的实际实现(数组实现)
  • 既然语言都有这些结构和api,为什么还需要手撸练习
  • 如何用队列结构实现栈结构
  • 如何使用栈结构实现队列结构
  • 求数组arr[L..R]中的最大值,怎么用递归方法实现
  • Master公式
  • 哈希表

章节3: 归并排序与随机快排 (15节)

  • 什么是归并排序
  • 归并排序(递归方法实现)
  • 归并排序(非递归方法实现)(1)
  • 归并排序(非递归方法实现)(2)
  • 归并排序时间复杂度分析
  • 根据常见面试题深入理解归并排序
  • 根据常见面试题深入理解归并排序代码解析
  • 在一个数组中求降序对
  • Partition过程
  • 荷兰国旗问题
  • 快速排序1.0
  • 快速排序2.0
  • 快速排序3.0
  • 怎么解决复杂度
  • 额外空间复杂度怎么估计

章节4: 比较器与堆 (18节)

  • 完全二叉树结构
  • 堆是什么
  • 大根堆讲解1
  • 大根堆代码1
  • 大根堆讲解2
  • 答疑
  • 下沉的复杂度是多少
  • 堆排序是什么
  • 堆排序优化1
  • 直观认识完全二叉树
  • 答疑1
  • 怎么保证每一个数再排完序的距离不会超过k
  • 答疑2
  • 比较器(重载比较运算符)
  • 比较器(排序)
  • 比较器(特殊标准排序的结构)
  • 什么情况下可以用语言提供的堆结构,什么情况下必须手动写
  • 什么情况下可以用语言提供的堆结构,什么情况下必须手动写代码实现

章节5: trie、桶排序、排序总结 (18节)

  • 答疑
  • 前缀树
  • 怎么实现前缀树
  • 答疑
  • word这个字符串之前加入过几次
  • 有多少字符串是以pre这个字符串作为前缀的
  • 删除
  • 答疑
  • 前缀树是怎么拓展的
  • 不基于比较的排序
  • 基数排序
  • 基数排序代码
  • 基数排序代码拆解
  • 计数排序和基数排序
  • 选择、冒泡、插入排序有没有稳定性
  • 归并、快排、堆排序有没有稳定性
  • 排序算法总结
  • 常见的坑

章节6: 链表相关面试题 (14节)

  • 链表问题
  • 快慢指针简介
  • 快慢指针代码
  • 给定一个单链表的头节点head,判断该链表是否为回文机构
  • 将单链表按某值划分成左边小、中间相等、右边大的形式
  • 特殊的单链表节点(用哈希表的方法)
  • 不用哈希表的方法
  • 两个有环也可能无环的单链表,如果相交,返回相交的第一个节点,如果不想交,返回null
  • 两个有环也可能无环的单链表,如果相交,返回相交的第一个节点,如果不想交,返回null代码实现
  • 两个无环链表是否相交
  • 两个无环链表是否相交代码
  • 答疑
  • 两个链表都有环有几种结构
  • 能不能不给单链表的头节点,只给想要删除的节点,就能做到在链表上把这个删掉

章节7: 二叉树的基本算法 (12节)

  • 什么叫二叉树
  • 二叉树遍历(什么叫子树)
  • 二叉树遍历是什么意思
  • 二叉树遍历实现
  • 非递归方式实现二叉树的遍历
  • 非递归方式实现二叉树的遍历(前序)
  • 非递归方式实现二叉树的遍历(中序)
  • 非递归方式实现二叉树的遍历(后序)
  • 实现二叉树按层遍历(队列方式)
  • 统计二叉树最大的宽度(用Map)
  • 统计二叉树最大的宽度(不用Map)
  • 二叉树的序列化和反序列化

章节8: 二叉树的递归套路 (16节)

  • 如何设计一个打印整棵树的打印函数
  • 给一个二叉树中的某个节点,返回该节点的后继节点1
  • 如果x没有又数
  • 后继
  • 给一个二叉树中的某个节点,返回该节点的后继节点2
  • 给一个二叉树中的某个节点,返回该节点的后继节点代码实现
  • 给定一个如如参数N,代表纸条都从下边上向上方连续对着N次,请从上到下导引所有折痕的方向1
  • 给定一个如如参数N,代表纸条都从下边上向上方连续对着N次,请从上到下导引所有折痕的方向2
  • 二叉树的递归套路1
  • 什么叫平衡树
  • 二叉树的递归套路2
  • 列出所有可能性后,确定到底需要向左树和右树要什么样的信息
  • 给定一颗二叉树的头结点head,任何两个节点之间都存在距离,返回整课二叉树的最大距离
  • 给定二叉树的头节点head,返回这个二叉树最大的二叉树搜索子树的头节点
  • 二叉树递归套路3
  • 排队的最大快乐值

章节9:贪心算法 (8节)

  • 返回这颗二叉树是不是满二叉树1
  • 返回这颗二叉树是不是满二叉树2
  • 返回a和b的最低公共祖先
  • 贪心算法
  • 贪心算法例子
  • 从头到尾讲一道利用贪心算法求解的题目(1)
  • 从头到尾讲一道利用贪心算法求解的题目(2)
  • 从头到尾讲一道利用贪心算法求解的题目(3)

章节10:并查集结构和图相关的算法 (10节)

  • 贪心算法求解的标准过程
  • 贪心算法的解题套路
  • 贪心算法的解题套路实战
  • 返回如果点亮str中所有需要点亮的位置,至少需要几盏灯
  • 整分整块金条,怎么分最省铜板
  • 每做完一个项目马上获得的收益可以支持你去做下一个项目不能并行的做项目你最后获得的最大钱数
  • 并查集
  • isSameSet和union方法的代价越低越好
  • 并查集代码
  • 并查集优化

章节11:暴力递归 (7节)

  • 合并users返回合并之后的用户数量
  • 图的宽度优先&深度优先遍历(1)
  • 图的宽度优先&深度优先遍历(2)
  • 图的拓扑排序算法
  • 最小生成树算法之Kruskal
  • 最小生成树算法之Prim

章节12:动态规划 (8节)

  • Dijkstra算法
  • 证明Dijkstra算法
  • 改进后的Dijkstra算法
  • 暴力递归
  • 汉诺塔问题(1)
  • 汉诺塔问题(2)
  • 汉诺塔问题(3)
  • 给你一个栈请你逆序这个栈不能申请额外的数据结构只能使用递归函数如何实现

章节13:暴力递归到动态规划1 (8节)

  • 二叉树序列化
  • 尝试
  • 打印一个字符串的全部子序列
  • 打印一个字符串的全部排列
  • 打印一个字符串的全部排列不出现重复的排列
  • 从左往右尝试模型1
  • 从左往右尝试模型2
  • 范围上尝试的模型

章节14:暴力递归到动态规划2 (9节)

  • 课前例题1讲解
  • 课前例题2讲解
  • N皇后
  • N皇后方法1
  • N皇后方法2
  • 回答问题
  • 怎么尝试一件事
  • 动态规划
  • 经典动态规划

章节15:暴力递归到动态规划3 (8节)

  • 返回让所有咖啡杯变干净的最早完成时间
  • 返回所有的路径中最小的路径和(1)
  • 返回所有的路径中最小的路径和(2)
  • 解题规律
  • 值为正数不重复每个值代表一种面值的货币每种面值的货币求组成 aim 的方法数(1)
  • 值为正数不重复每个值代表一种面值的货币每种面值的货币求组成 aim 的方法数(2)
  • 值为正数不重复每个值代表一种面值的货币每种面值的货币求组成 aim 的方法数(3)
  • 枚举行为优化

章节16:暴力递归到动态规划4 (9节)

  • 返回需要至少多少张贴纸可以完成任务方法1(1)
  • 返回需要至少多少张贴纸可以完成任务方法1(2)
  • 返回需要至少多少张贴纸可以完成任务方法2
  • 总结
  • 两个字符串的最长公共子序列问题(1)
  • 两个字符串的最长公共子序列问题(2)
  • 两个字符串的最长公共子序列问题(13)
  • 返回让所有咖啡杯变干净的最早完成时间方法1
  • 返回让所有咖啡杯变干净的最早完成时间方法2