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;
}
}