Course Schedule 1 & 2

代碼來源:https://leetcode.com/problems/course-schedule/discuss/58524/Java-DFS-and-BFS-solution (我以爲寫的很完美,直接搬來用了)java

既能夠按照「入度」的方式進行拓撲排序,也能夠按照「出度」的方式進行排序 出度:數組

public boolean canFinish(int numCourses, int[][] prerequisites) {
        ArrayList<Integer>[] graph = new ArrayList[numCourses];
        int[] degree = new int[numCourses];
        Queue<Integer> queue = new LinkedList<>();
        ArrayList<Integer> order = new ArrayList<>();
        int count = 0;

        for (int i = 0; i < numCourses; i++) {
            graph[i] = new ArrayList<>();
        }

        for (int i = 0; i < prerequisites.length; i++) {
            degree[prerequisites[i][1]]++;
            graph[prerequisites[i][0]].add(prerequisites[i][1]);
        }

        for (int i = 0; i < degree.length; i++) {
            if (degree[i] == 0) {
                order.add(i);
                queue.add(i);
                count++;
            }
        }

        while (queue.size() != 0) {
            int course = queue.poll();
            ArrayList<Integer> list = graph[course];
            for (int i = 0; i < list.size(); i++) {
                int pointer = list.get(i);
                degree[pointer]--;

                if (degree[pointer] == 0) {
                    order.add(pointer);
                    queue.add(pointer);
                    count++;
                }

            }
        }
        if (count == numCourses) return true;
        return false;
    }

入度的話,將ui

degree[prerequisites[i][1]]++;
    graph[prerequisites[i][0]].add(prerequisites[i][1]);

改成.net

degree[prerequisites[i][0]]++;
graph[prerequisites[i][1]].add(prerequisites[i][0]);

對於Course Schedule 2code

只要用數組保存每次 degree[i]=0 時的課程序號就獲得了課程的前後順序blog

可是注意,使用 出度 排序的時候,課程順序是逆的,須要咱們額外的逆轉數組排序

使用 入度 排序的時候,課程順序恰好是正的leetcode

相關連接: 深刻理解拓撲排序(Topological sort) 拓撲排序入門get

相關文章
相關標籤/搜索