LeetCode 210. 课程表 II
//本题主要是采用拓扑排序的思想
public int[] findOrder(int numCourses, int[][] prerequisites) {
if(numCourses <= 0) return new int[0];
HashSet<Integer>[] adj = new HashSet[numCourses]; //放邻近点
for(int i = 0; i < numCourses; i++){
adj[i] = new HashSet<>();
}
//[0,1] 表示为 1-> 0 p[0]为点的入度
int[] inDegree = new int[numCourses]; //每个点的入度
for(int[] p : prerequisites){
adj[p[1]].add(p[0]);
inDegree[p[0]]++;
}
Queue<Integer> queue = new LinkedList<>(); //存放入度为0的点
for(int i = 0; i < numCourses; i++){
if(inDegree[i] == 0) queue.add(i);
}
int[] res = new int[numCourses];
int i = 0;
while(!queue.isEmpty()){
int head = queue.poll();
res[i++] = head;
Set<Integer> successors = adj[head];
for(int nextCourse : successors){
inDegree[nextCourse]--;
if(inDegree[nextCourse] == 0){
queue.add(nextCourse);
}
}
}
if(i == numCourses) return res;
return new int[0];
}