课程表Ⅱ
现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。
例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。
Code
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
// 记录<节点, 它的后继节点>
unordered_map<int, vector<int>> graph;
for(auto vt : prerequisites){
graph[vt[1]].push_back(vt[0]);
}
// 记录每个节点的入度
unordered_map<int, int> inDegree;
for(int i = 0; i < numCourses; ++i){
for(auto degree : graph[i]){
inDegree[degree]++;
}
}
// 开始拓扑排序
queue<int> que;
for(int i = 0; i < numCourses; ++i){
if(!inDegree[i]){
que.push(i);
}
}
vector<int> ans;
while(!que.empty()){
int node = que.front();
que.pop();
ans.push_back(node);
// 更新入度,删除节点
vector<int> v = graph[node];
for(auto degree : v){
inDegree[degree]--;
if(!inDegree[degree]){
que.push(degree);
}
}
graph.erase(node);
}
return (ans.size() == numCourses) ? ans : vector<int>();
}
};