第13题:210. Course Schedule II
类似之前写的那篇,这里就不分析了。
题目具体分析请见 leetcode题集: 207. Course Schedule 和 拓扑排序 两篇文章。就是拓扑排序,加个打印输出拓扑序列。这里直接贴代码了:
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
int degree[numCourses];
memset(degree, 0, sizeof(int)*numCourses); //记录节点入度
vector<vector<int>> graph(numCourses);
int len = prerequisites.size();
for(int i=0;i<len;i++){ //图的构建
graph[prerequisites[i][1]].push_back(prerequisites[i][0]);
degree[prerequisites[i][0]]++;
}
queue<int> qu; //队列来记录入度为0的节点
for(int i=0;i<numCourses;i++){
if(degree[i]==0){
qu.push(i);
}
}
int node = 0;
vector<int> res; //vector记录拓扑序列
while(!qu.empty()){
node = qu.front();
res.push_back(node);
qu.pop();
degree[node]--;
for(int i : graph[node]){ //将该节点所有的相关有向边入度减少
degree[i]--;
if(degree[i]==0) qu.push(i);
}
}
//序列数不等于节点数表示有环,则返回空
return (res.size()==numCourses?res:vector<int>());
}
};
结果马马虎虎吧,其实跟推荐的16ms的写法一样,但是不知道为啥就是20ms了