import java.util.ArrayList;
import java.util.Deque;
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
// 思路: 入度为0的点入队。依次出队的时候。遍历当前点的指向。入度减1,
// 如果入度为0.进队。
// 队列为空了。但是还有点没有入队。那么就是有环。
int[] cnt = new int[numCourses]; // 保存每个点的入度。
// 邻接表实现图
ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
for (int i = 0; i < cnt.length; i++) {
graph.add(new ArrayList<Integer>());
}
for (int i = 0; i < prerequisites.length; i++) {
int from = prerequisites[i][1];
int to = prerequisites[i][0];
graph.get(from).add(to);
cnt[to]++; // 入度+1
}
int[] queue = new int[numCourses]; // 队列
int l = 0;
int r = 0;
// 入度为0的先进队列
for (int i = 0; i < numCourses; i++) {
if (cnt[i] == 0) {
queue[r++] = i;
}
}
int[] ans = new int[numCourses];
int a = 0;
// 依次出队
while (l != r) {
int cur = queue[l++]; // 出队
ans[a++] = cur; // 收集答案
for (int next : graph.get(cur)) {
cnt[next]--; // 入度减一
if (cnt[next] == 0) {
// 入度为0.可以进队
queue[r++] = next;
}
}
}
if (a == numCourses) {
return ans;
}
return new int[] {};
}
}