Acwing算法课程/模板代码 学习理解

文章目录

  • 算法基础课
    • `数据结构`
    • 排序
      • 快速排序
      • 归并排序
    • 二分查找
      • 整数
      • 浮点数
    • 高性能Ope
      • 加减法
      • 乘除法
    • 前缀和/差分
      • 一维
      • 二维
    • 位运算
    • 双指针
    • 离散化
    • 区间合并
    • `数据结构`
    • 链表
    • 队列
    • KMP
    • Trie树
    • 并查集
    • 哈希
    • 图 [ACWing](https://www.acwing.com/blog/content/405/)
      • 图的存储
      • 图的遍历
      • 拓扑排序
      • 图的最短路径
      • 图的最小生成树
      • 二分图的判别
      • 二分图的最大匹配
    • 数学知识
    • 动态规划
    • 贪心
  • 算法提高
  • 算法进阶

  • 太穷了,只看看模板代码吧

算法基础课

数据结构

排序

快速排序

归并排序

二分查找

整数

浮点数

高性能Ope

加减法

乘除法

前缀和/差分

一维

二维

位运算

双指针

离散化

区间合并

数据结构

链表

  • 单双

  • 普通 / 单调

队列

  • 普通 / 循环 / 单调

KMP

Trie树

并查集

  • 普通
  • 改进

哈希

  • 一般 / 字符串哈希

图 ACWing

图的存储

  • 邻接矩阵(稠密) / 邻接表(稀疏)

图的遍历

  • DFS / BFS

拓扑排序

  • 针对有向图
  • 对图节点进行排序 成一维数组
  • A -> B,A出现在B的前面
  • 如果且仅当图形没有定向循环,即如果它是有向无环图(DAG),则拓扑排序是可能的
  • 以课程表为例子:[[1, 0], [0, 2], [1, 3]],表示0课程完成之后,1课程才能修,输出一种修课的顺序
class Solution {
public:
    bool topSort(vector<vector<int>>& G, vector<int>& O, vector<int>& D) {
        int N = D.size(), idx = 0;
        queue<int> Q; // 入度为0才能做学习起点
        for (int i = 0; i < N; i++) 
            if (D[i] == 0) Q.push(i);
        while (!Q.empty()) {
            int X = Q.front(); Q.pop();
            O[idx++] = X;
            for (int i = 0; i < G[X].size(); i++) {
                int x = G[X][i]; D[x]--;
                if (D[x] == 0) Q.push(x);
            }
            G[X].clear();
        }
        if (idx == N) return true;
        return false;
    }
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int> inD(numCourses), res(numCourses); // 入度表 课程排序
        vector<vector<int>> G(numCourses); // 邻接表
        for (int i = 0; i < prerequisites.size(); i++) {
            G[prerequisites[i][1]].push_back(prerequisites[i][0]);
            inD[prerequisites[i][0]]++;
        }
        if (topSort(G, res, inD)) return res;
        return {};
    }
};

图的最短路径

  • Dijkstra算法,有朴素的和经过堆优化的,不能处理负权 (贪心思路
  • Bellman - Ford algorithm 算法,能处理负权:最大的不同是每次都是从源点s重新出发进行"松弛"更新操作,而Dijkstra则是从源点出发向外扩逐个处理相邻的节点,不会去重复处理节点,这边也可以看出Dijkstra效率相对更高点。(动态规划思路
  • spfa算法,队列优化的BF算法,spfa可判断图中是否存在负环
  • floyd算法,经典的多源最短路径算法

图的最小生成树

  • Prime算法:从边的角度,不取决边数,贪心思想,适合稠密图
  • Kruskal算法,从点的角度,取决边数,贪心算法,适合稀疏图
  • prim适合点多的稠密图,kruskal适合边多的。

二分图的判别

  • 染色法

二分图的最大匹配

  • 匈牙利算法

数学知识

动态规划

贪心

算法提高

算法进阶

你可能感兴趣的:(笔记,CS,-,Algo)