思路:
使用广度优先,记录入度数
每次出队列,都把该数的后继节点的入度数-1,如果入度变为0,就入队列
把队列里的顺序记录到数组中
代码:
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
// if(numCourses==0)
// return new int[0];
// if(prerequisites.length==0){
// return new int[]{0};
// }
int[] inDegree=new int[numCourses];
Queue <Integer> queue=new LinkedList<>();
for(int[] p:prerequisites){
inDegree[p[0]]++;
}
for(int i=0;i<numCourses;i++){
if(inDegree[i]==0){
queue.offer(i);
}
}
List<Integer> list=new ArrayList<>();
while(!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){
Integer cur=queue.poll();
list.add(cur);
for(int[] p:prerequisites){
if(p[1]==cur){
inDegree[p[0]]--;
if(inDegree[p[0]]==0){
queue.offer(p[0]);
}
}
}
}
}
if(list.size()==numCourses){
int[] res=new int[numCourses];
for(int i=0;i<numCourses;i++){
res[i]=list.get(i);
}
return res;
}else{
return new int[0];
}
}
}
分解:
1)最后的判断,如果不符合,返回的是new int[0],注意这个形式
if(list.size()==numCourses){
int[] res=new int[numCourses];
for(int i=0;i<numCourses;i++){
res[i]=list.get(i);
}
return res;
}else{
return new int[0];
}