210. Course Schedule II

Question

There are a total of n courses you have to take, labeled from 0 to n - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, return the ordering of courses you should take to finish all courses.

There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.

For example:

2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is [0,1]

4, [[1,0],[2,0],[3,1],[3,2]]
There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is [0,1,2,3]. Another correct ordering is[0,2,1,3].

Code

public class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        int[] degree = new int[numCourses];
        int m = prerequisites.length;
        
        for (int i = 0; i < m; i++) {
            degree[prerequisites[i][0]]++;
        }
        
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < degree.length; i++) {
            if (degree[i] == 0) queue.offer(i);
        }
        
        int[] result = new int[numCourses];
        int count = 0, total = queue.size();
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                int pre = queue.poll();
                result[count++] = pre;
                for (int j = 0; j < m; j++) {
                    if (prerequisites[j][1] == pre) {
                        int post = prerequisites[j][0];
                        degree[post]--;
                        if (degree[post] == 0) {
                            queue.offer(post);
                            total++;
                        }
                    }
                }
            }
        }
        if (total != numCourses) return new int[0];
        return result;
    }
}

Solution

與Course Schedule思路相同,拓?fù)渑判颉FS時(shí)按序?qū)⒚恳粚拥捻旤c(diǎn)加入結(jié)果集中。同時(shí)與Course Schedule相同,需要注意圖中是否有環(huán)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容