LeetCode每日一题210. 课程表 II(拓扑排序BFS、DFS)

634 阅读1分钟

public class Num210课程表II {
    public static int[] findOrder(int numCourses, int[][] prerequisites) {
        //存放每个点的入度
        int[] input = new int[numCourses];
        //存放结果
        int[] ans = new int[numCourses];
        //根据课程先后获取每个点的入度是多少
        for (int[] edge : prerequisites) {
            input[edge[0]]++;
        }
        //BFS遍历用的队列,
        Queue<Integer> queue = new LinkedList<>();
        //入度为0的点入队列
        for (int i = 0; i < numCourses; i++) {
            if (input[i] == 0) {
                queue.offer(i);
            }
        }
        //统计结果数量,如果有环的话,选课选不完,pos会小于课程数量
        int pos = 0;
        while (!queue.isEmpty()) {
            //入度为0的点可以直接加入结果,即可以直接修课程
            int temp = queue.poll();
            ans[pos++] = temp;
            //将以temp作为先修课程的入度都减1
            for (int[] edge : prerequisites) {
                if (edge[1] == temp) {
                    input[edge[0]]--;
                    if (input[edge[0]] == 0) {
                        queue.offer(edge[0]);
                    }
                }
            }
        }
        if (pos != numCourses) return new int[]{};
        return ans;
    }
}