算法基础课
数据结构
排序
快速排序
归并排序
二分查找
整数
浮点数
高性能Ope
加减法
乘除法
前缀和/差分
一维
二维
位运算
双指针
离散化
区间合并
数据结构
链表
栈
队列
KMP
Trie树
并查集
堆
哈希
图的存储
图的遍历
拓扑排序
- 针对有向图
- 对图节点进行排序 成一维数组
- 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;
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适合边多的。
二分图的判别
二分图的最大匹配
数学知识
动态规划
贪心
算法提高
算法进阶