Algorithms from the Scratch

0 Essential CPP

基于 《Essential C++》 梳理 C++ 核心知识。

1 Complexity, Bit Operation, and Sort

  • 位运算符的妙用;
  • 基本排序方法:选择排序、冒泡排序、插入排序;
  • 使用对数器对算法进行测试和检验;
  • 使用 C11 风格生成随机数。

2 Recursion

  • 递归**与用主方法估计复杂度;
  • 归并排序以及基于归并排序的小和问题、逆序问题;
  • 双指针和三指针的荷兰国旗问题以及引申出来的快速排序。

3 Heap

  • 堆排序;
  • 用堆解决部分排序问题;
  • 利用优先队列内部是一个堆的特性来解决问题;
  • 桶排序;
  • 排序方法梳理与总结。

4 Linked List

  • 有序表和无序表;
  • 单链表和双向链表的基本操作(创建、删除、增删改查节点);
  • 单链表的中等题:回文链表、区间划分、拷贝含有随机指针的链表;
  • 单链表的难题:判断两个可能有环的链表是否相交。

5 Tree

  • 二叉树的创建、数节点个数等基本操作;
  • 二叉树的递归**以及先序遍历、中序遍历、后续遍历的递归/非递归实现;
  • 二叉树的 BFS 以及最大宽度;
  • 二叉树的递归框架:判断给定二叉树是否为搜索、满、完全、平衡二叉树等;
  • 找最低公共祖先节点;
  • 找后继节点;
  • 二叉树的序列化和反序列化。

6 Graph

  • 实现适配器,将各种表示的图转换为最好写代码的图的数据结构;
  • 图上的 BFS 和 DFS;
  • 有向无环图的拓扑排序;
  • 最小生成树的 K 算法 和 P 算法(并查集等 API 的自主实现);
  • Dijkstra 算法求最短路径和。

7 Greedy

  • 前缀树的实现和使用;
  • 贪心策略的设计(四道例题);
  • n 皇后问题等 8 道题目(暴力递归/回溯)。

8 Hashing

  • 基于哈希函数和位图的一系列应用;
  • 理解布隆过滤器的使用;
  • 理解一致性哈希。

9 Advanced String and Array

  • 01 岛问题的并行算法设计(并查集结构);
  • MKP 算法;
  • Manacher 算法;
  • 滑动窗口与双端队列;
  • 单调栈。

10 Tree Revisited

  • 树型动态规划框架;
  • Morris 遍历及其应用(前序、中序、后序遍历以及判定是否为 BST 等)。

11 Dynamic Programming

  • 动态规划问题的分析步骤(三步走策略)。

12 Ordered List

  • 二叉搜索树的基本操作(尤其是删除节点的实现);
  • 平衡二叉搜索树的实现(AVL 树、SB 树、红黑树);
  • 跳表。

13 Practice

  • 滑动窗口、打表找规律、预处理数组;
  • 括号问题;
  • 基于业务分析的题;
  • 矩阵的各种花式打印;
  • 基于已知的数据结构实现另外的数据结构;
  • 动态规划的空间压缩技巧;
  • 落水问题与双指针;
  • 动态规划确定表范围;
  • 更多跟业务分析相关的题;
  • 严格递归问题的矩阵求法;
  • 前缀树的应用;
  • 更多树型 DP 题目;
  • 统计给定字符串中不重复子序列的个数。