https://leetcode-cn.com/problems/course-schedule-ii/
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
ArrayList<ArrayList<Integer>> list=new ArrayList<>(numCourses);//邻接表
int[] in=new int[numCourses];//入度,作为终点
for(int i=0;i<numCourses;i++){
list.add(new ArrayList<>());
}
//建立邻接表
for(int[] cp:prerequisites){
int a=cp[0];
int b=cp[1];
in[a]++;
list.get(b).add(a);
}
//将入度为0的结点加入队列
LinkedList<Integer> queue=new LinkedList<>();
for(int i=0;i<numCourses;i++){
if(in[i]==0)
queue.add(i);
}
//课程顺序结果集
ArrayList<Integer> res=new ArrayList<>();
while(!queue.isEmpty()){
Integer pre=queue.poll();//取出一个入度为0的结点
res.add(pre);//加入结果集
ArrayList<Integer> mylist=list.get(pre);//取出这个结点的邻接表
//遍历以结点为起点的,i结点
for(Integer i:mylist){
in[i]--;//以i为终点的结点数-1,即入度-1
//入度为0,加入队列
if(in[i]==0)
queue.add(i);
}
numCourses--;//未安排课程数-1
}
//输出结果
int[] rs=new int[res.size()];
for(int i=0;i<res.size();i++){
rs[i]=res.get(i);
}
return numCourses!=0?new int[0]:rs;
}
}