adjList
中存储结构是这样的:adjList[i]
数组的存放的是课程i修完之后才能修的课程
入度数量代表着该门课程有几门先修课程
java 实现
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
//首先创建邻接表来存储图
List<List<Integer>> adjList = new ArrayList<>();
for(int i = 0; i < numCourses; i++) {
adjList.add(new ArrayList<>());
}
//创建一个数组来存储每个节点的入度
int[] inDegree = new int[numCourses];
//更新邻接表和入度数组
for(int[] prerequisite : prerequisites) {
int course = prerequisite[0];
int prerequisiteCourse = prerequisite[1];
adjList.get(prerequisiteCourse).add(course);
inDegree[course]++;
}
//然后创建一个队列来处理所有入度为0的节点
Queue<Integer> queue = new LinkedList<>();
for(int i = 0; i < numCourses; i++) {
if(inDegree[i] == 0) {
queue.offer(i);
}
}
//创建一个结果数组来存储结果,返回的是课程的下标序号,从0开始
int[] result = new int[numCourses];
int index = 0;
while(!queue.isEmpty()) {
int current = queue.poll(); //current入度为0但是出度可能不为0
result[index++] = current;
//更新邻接节点的入度
for(int neighbor : adjList.get(current)) {
inDegree[neighbor]--;
if(inDegree[neighbor] == 0) {
queue.offer(neighbor); //也就是说,只有入度为0的节点可以进入queue中
}
}
}
if(index != numCourses) { //说明可能存在环
return new int[0];
}
return result;
}
}