剑指 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. 课程顺序的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer II 113. 课程顺序

剑指 Offer II 113. 课程顺序

剑指 Offer II 113. 课程顺序

剑指 Offer II 113. 课程顺序

剑指 Offer II 113. 课程顺序

Java每日一题——>剑指 Offer II 034. 外星语言是否排序