剑指 Offer II 113. 课程顺序
Posted Blocking The Sky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer II 113. 课程顺序相关的知识,希望对你有一定的参考价值。
现在总共有 numCourses 门课需要选,记为 0 到 numCourses-1。
给定一个数组 prerequisites ,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i] = [ai, bi] 表示想要学习课程 ai ,需要先完成课程 bi 。
请根据给出的总课程数 numCourses 和表示先修顺序的 prerequisites 得出一个可行的修课序列。
可能会有多个正确的顺序,只要任意返回一种就可以了。如果不可能完成所有课程,返回一个空数组。
示例 1:
输入: numCourses = 2, prerequisites = [[1,0]]
输出: [0,1]
解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。
示例 2:
输入: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
输出: [0,1,2,3] or [0,2,1,3]
解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。
拓扑排序
class Solution
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites)
int indegree[2001];
vector<int> result;
memset(indegree,0,sizeof(indegree));
int edge[2001][2001];
for(int i=0;i<numCourses;i++)
for(int j=0;j<numCourses;j++)
edge[i][j]=0;
for(int i=0;i<prerequisites.size();i++)
edge[prerequisites[i][1]][prerequisites[i][0]]=1;
indegree[prerequisites[i][0]]++;
stack<int> s;
for(int i=0;i<numCourses;i++)
if(indegree[i]==0)
s.push(i);
while(!s.empty())
int temp;
temp=s.top();
result.push_back(temp);
s.pop();
for(int i=0;i<numCourses;i++)
if(edge[temp][i]==1&&indegree[i]>0)
indegree[i]--;
if(indegree[i]==0)
s.push(i);
if(result.size()==numCourses)
return result;
else
return ;
;
以上是关于剑指 Offer II 113. 课程顺序的主要内容,如果未能解决你的问题,请参考以下文章