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

相关文章
相关标签/搜索