算法题类型

1. 排序与查找

  • 排序问题:将一组数据按照特定顺序(通常是升序或降序)排列。
    • 基础排序:简单直观,适用于小规模数据。
      • 冒泡排序:通过不断交换相邻元素进行排序。(稳定排序
      • 选择排序:每次选择未排序部分的最小元素放到已排序部分的末尾。(不稳定排序
      • 插入排序:将每个元素插入到已排序部分的正确位置。(稳定排序
    • 高级排序:效率较高,适用于大规模数据。
      • 快速排序:通过分治法和基准元素进行排序。(不稳定排序
      • 归并排序:通过分治法将数据分成小份排序,然后合并。(稳定排序
      • 堆排序:利用堆这种数据结构进行排序。(不稳定排序
    • 线性排序:时间复杂度为O(n),适用于特定类型的数据。
      • 计数排序:适用于数据范围较小的整数。(稳定排序
      • 桶排序:将数据分到不同的桶中,然后分别排序。(稳定排序
      • 基数排序:按位进行排序,适用于整数或字符串。(稳定排序
    • 特殊排序:针对特定场景的排序算法。
      • 外部排序:用于处理无法一次性加载到内存的数据。
  • 查找问题:在数据集中寻找特定元素。
    • 线性查找:逐个遍历数据,直到找到目标元素。(时间复杂度O(n)
    • 二分查找:在已排序数据中,通过不断缩小搜索范围来查找目标元素。(时间复杂度O(log n)
    • 二分查找变种:查找第一个大于等于目标值的元素、查找最后一个小于等于目标值的元素等。
    • 矩阵中的目标值查找:在二维数组中查找目标元素。

2. 数学与数论

  • 基础数学
    • 素数判断:判断一个数是否为素数(只能被1和自身整除的数)。
      • 试除法:通过尝试除以小于等于其平方根的所有整数来判断。(时间复杂度O(sqrt(n))
      • 埃拉托斯特尼筛法:一种高效的筛选素数的方法。(时间复杂度O(n log log n)
    • 最大公约数与最小公倍数:
      • 欧几里得算法:用于计算两个整数的最大公约数。(时间复杂度O(log(a, b))
    • 快速幂:高效计算大整数的幂。(时间复杂度O(log n)
    • 二进制转换:
      • 二进制转十进制
      • 十进制转二进制
  • 数论:研究整数性质的数学分支。
    • 同余问题:
      • 线性同余方程:求解形如ax ≡ b (mod m)的方程。
      • 模运算:求一个数除以另一个数的余数。
    • 数论函数:定义在整数集合上的函数。
      • 欧拉函数:计算小于等于n且与n互质的正整数个数。
      • 莫比乌斯函数:一个数论函数,用于解决一些组合数学问题。
    • 中国剩余定理:求解同余方程组。
    • 矩阵快速幂:用于快速计算矩阵的幂。
  • 组合数学:研究组合问题的数学分支。
    • 组合数与杨辉三角:
      • 组合数:从n个元素中选择k个元素的方案数。
      • 杨辉三角:一个数表,用于计算组合数。
    • 卡特兰数:一个出现在各种组合问题中的数列。

3. 动态规划 (Dynamic Programming, DP)

  • 经典DP问题
    • 斐波那契数列:一个递归定义的数列,每个数是前两个数之和。(时间复杂度O(n)
    • 背包问题:
      • 0/1背包:每个物品只能选择一次。(时间复杂度O(n*capacity)
      • 完全背包:每个物品可以选择多次。(时间复杂度O(n*capacity)
      • 多重背包:每个物品有有限个。(时间复杂度O(n_capacity_count)
    • 最长公共子序列(LCS):两个序列的最长公共子序列。(时间复杂度O(m*n)
    • 最长递增子序列(LIS):一个序列的最长递增子序列。(时间复杂度O(n log n)
    • 硬币换零钱问题:用最少的硬币凑出指定金额。(时间复杂度O(amount*n)
    • 矩阵链乘法:找到矩阵相乘的最佳顺序,使得运算次数最少。(时间复杂度O(n^3)
  • 其他DP问题
    • 编辑距离问题:将一个字符串转换为另一个字符串所需的最少操作次数。(时间复杂度O(m*n)
    • 打家劫舍问题:在不能偷窃相邻房屋的情况下,偷窃最多金额。(时间复杂度O(n)
    • 状态压缩DP:使用位运算来表示状态的动态规划。
    • 数位DP:用于解决与数字位数有关的动态规划问题。

4. 贪心算法

  • 经典贪心问题
    • 活动选择问题:选择最多的不重叠活动。(时间复杂度O(n log n)
    • 区间调度问题:选择最多的非重叠时间区间。(时间复杂度O(n log n)
    • 零钱兑换问题:用最少的硬币凑出指定金额。(不一定能找到最优解
  • 其他贪心问题
    • 最小生成树:找到连接所有顶点的最小权值边的集合。
      • Prim算法(时间复杂度O(n^2)
      • Kruskal算法(时间复杂度O(m log n)
    • 霍夫曼编码:用于数据压缩的编码方式。(时间复杂度O(n log n)
    • 分数背包问题:允许选择物品的一部分。(时间复杂度O(n log n)
    • Huffman树:一种用于霍夫曼编码的树结构。

5. 回溯法 (Backtracking)

  • 经典回溯问题
    • 八皇后问题:在棋盘上放置八个皇后,使其互不攻击。(时间复杂度较高
    • N皇后问题:八皇后问题的推广。(时间复杂度较高
    • 全排列与组合:生成集合的所有排列和组合。(时间复杂度较高
    • 数独问题:填充数独游戏。(时间复杂度较高
  • 其他回溯问题
    • 矩阵路径问题:在矩阵中寻找满足条件的路径。(时间复杂度较高
    • 子集和问题:找到一个集合的子集,其元素之和等于目标值。(时间复杂度较高

6. 分治法 (Divide and Conquer)

  • 经典分治问题
    • 排序问题:
      • 归并排序(时间复杂度O(n log n)
      • 快速排序(平均时间复杂度O(n log n),最坏时间复杂度O(n^2)
    • 逆序对计数:计算数组中的逆序对数。(时间复杂度O(n log n)
    • 最大子数组和问题:找到数组中和最大的连续子数组。(时间复杂度O(n)
  • 其他分治问题
    • 矩阵乘法:
      • Strassen算法(时间复杂度O(n^log2(7))

7. 图论 (Graph Theory)

  • 图的遍历
    • 深度优先搜索(DFS):沿着图的深度方向遍历。(时间复杂度O(V+E)
    • 广度优先搜索(BFS):沿着图的宽度方向遍历。(时间复杂度O(V+E)
  • 最短路径问题
    • Dijkstra算法:用于计算非负权图的单源最短路径。(时间复杂度O(E log V)
    • Bellman-Ford算法:用于计算可以包含负权边的图的单源最短路径。(时间复杂度O(V*E)
    • Floyd-Warshall 算法:用于计算任意两点之间的最短路径。(时间复杂度O(V^3)
  • 最小生成树问题
    • Prim 算法(时间复杂度O(E log V)
    • Kruskal 算法(时间复杂度O(E log V)
  • 其他图论问题
    • 拓扑排序:对有向无环图进行排序,使得所有边都指向后面的顶点。(时间复杂度O(V+E)
    • 强连通分量:找到图中互相可达的顶点集合。(时间复杂度O(V+E)
    • 图的二分性判断:判断一个图是否为二分图。(时间复杂度O(V+E)
    • 网络流:研究网络中流量的分配问题。
    • 二分图匹配:找到二分图中最大的匹配数。

8. 位运算

  • 位运算技巧:直接对二进制位进行操作,效率高。
    • 判断是否为 2 的幂:n & (n - 1) == 0
    • 统计二进制中 1 的个数:Hamming Weight
    • 交换两个数的值:a ^= b; b ^= a; a ^= b;
    • 找出只出现一次的数字:利用异或运算的性质
    • 计算二进制补码
  • 位运算应用
    • 状态压缩:用二进制位表示状态
    • 快速幂:利用位运算优化幂运算

9. 树与二叉树

  • 二叉树的遍历
    • 前序、中序、后序遍历:递归或迭代方式访问所有节点
    • 层次遍历:逐层访问节点
  • 二叉树的性质
    • 判断是否为二叉搜索树:中序遍历结果为升序
    • 二叉树的最大深度:递归或迭代方式求解
    • 路径和问题:寻找满足条件的路径
  • 其他树结构
    • 平衡二叉搜索树:
      • AVL 树:保持左右子树高度差不超过 1
      • 红黑树:一种自平衡的二叉搜索树
    • 线段树:用于处理区间查询问题
    • 字典树:用于存储和查找字符串

10. 并行与分布式算法

  • 并行算法:利用多核处理器并行计算,提高效率。
    • 并行排序问题
    • 并行搜索问题
  • 分布式算法:在分布式系统中运行的算法,解决大规模数据处理和存储问题。
    • MapReduce 问题:一种分布式计算框架
    • 分布式一致性问题:Paxos、Raft 等协议

11. 高级数据结构

  • 平衡树
    • AVL 树
    • 红黑树
  • 其他数据结构
    • 跳表:一种有序链表,支持快速查找
    • 并查集(Union-Find):用于处理集合的合并和查询操作
    • LRU 缓存机制:最近最少使用缓存
    • 堆(优先队列):一种特殊的树形数据结构,用于快速访问最大/最小值