/*
1 建立list数组 存放 基础课程的后续课程,
2 建立int数组 存放 后续课程需要的基础课程数量;
3 建立queue 用于bfs
把基础课程放入queue 每层bfs 找出 基础课程的后续可能 若其需要基础课程的数量为0 则 推入queue中,并且写入result;
*/
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int[] result = new int[numCourses];
List[] postCourse = new ArrayList[numCourses];
int[] reqNum = new int[numCourses];
Queue<Integer> q = new LinkedList<>();
for(int i = 0; i < numCourses; i++) {
postCourse[i] = new ArrayList<Integer>();
}
for(int i = 0; i < prerequisites.length; i++) {
postCourse[prerequisites[i][1]].add(prerequisites[i][0]);
reqNum[prerequisites[i][0]]++;
}
for(int i = 0; i < numCourses; i++) {
if(reqNum[i] == 0) {
q.offer(i);
}
}
int count = 0;
while(!q.isEmpty()) {
int temp = q.poll();
result[count++] = temp;
for(int i = 0; i < postCourse[temp].size(); i++) {
reqNum[(int)postCourse[temp].get(i)]--;
if(reqNum[(int)postCourse[temp].get(i)] == 0) {
q.offer((int)postCourse[temp].get(i));
}
}
}
if(count == numCourses) {
return result;
}
return new int[0];
}
}