AC代码
本题和207.课程表类似,不过要求让我们输出排课的顺序,也就是拓扑序列了。
在这里返回结果的时候注意,如果这是个有环的图,那么答案数组返回的应该是空数组,之前我没注意,当样例如下时:
2
[[0,1],[1,0]]
返回的结果是[0,0]
,实际上应该是空数组。为了解决这个问题我们可以和207题一样,通过cnt来计数,最终和课程数相同的话,就返回答案数组否则返回空数组。
class Solution {
public int[] findOrder(int n, int[][] array) {
HashSet<Integer>[] set=new HashSet[n];
int[] degree=new int[n];
for(int i=0;i<n;i++)
set[i]=new HashSet<>();
for(int[] x:array){
set[x[1]].add(x[0]);
degree[x[0]]++;
}
int[] res=new int[n];
int cnt=0;
Queue<Integer> q=new LinkedList<>();
for(int i=0;i<n;i++)
if(degree[i]==0)
q.add(i);
int i=0;
while(!q.isEmpty()){
int cur=q.peek();
q.poll();
cnt++;
res[i++]=cur;
for(int next:set[cur]){
degree[next]--;
if(degree[next]==0)
q.add(next);
}
}
return cnt==n?res:new int[0];
}
}