Solution URL
https://leetcode.com/submissions/detail/414627437/
代码
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
//https://www.youtube.com/watch?v=qunhYX91VLU
int[] indegree = new int[numCourses];
int[] res = new int[numCourses];
int k = 0;
//统计入度
for(int[] pairs: prerequisites){
indegree[pairs[0]]++;
}
Queue<Integer> queue = new LinkedList<>();
//入度为0,入队(即不需要前置课),当前课程进res
for(int i = 0; i < numCourses ; i++){
if(indegree[i] == 0){
queue.offer(i);
res[k++] = i;
}
}
//比较课程号和入度的关系,更新入度的值
while(!queue.isEmpty()){
//入度为0的课程号,可以为做先修课
int pre = queue.poll();
for(int[] pairs: prerequisites){
//入度为0的课程号,刚好是当前课程的先修课,则入度-1
if(pre == pairs[1]){
indegree[pairs[0]]--;
//若入度已经为0,则已经可以修了。入队,入结果集
if(indegree[pairs[0]] == 0){
queue.offer(pairs[0]);
res[k++] = pairs[0];
}
}
}
}
return k == numCourses ? res : new int[0];
}
}