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

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

算法基础课

数据结构

排序

快速排序

归并排序

二分查找

整数

浮点数

高性能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适合边多的。

二分图的判别

  • 染色法

二分图的最大匹配

  • 匈牙利算法

数学知识

动态规划

贪心

算法提高

算法进阶

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值