第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了