题目

思路
- 根据课程间的依赖关系建立一个有向图, 用List<List<Integer>>, Integer表示课程号。
- 建图的同时统计图中每个节点的入度,生成入度表inDegree
- 维护一个queue,表示当前不需要前置课程可以开始学习的课,即:将所有入度为0的节点加入queue
- 每入queue一门课,count + 1
- queue非空时,依次将队首节点出队,记为curCourse,然后把它所有的后继课程adjCourse们的入度-1
- 如果存在环,则肯定有课程入度永远不为零,永远无法被加入queue。那么,当queue空时,count不会等于课程总数。


代码
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
List<List<Integer>> graph = new ArrayList<>();
int[] inDegree = new int[numCourses];
for (int i = 0; i < numCourses; i++) {
graph.add(new ArrayList<>());
}
for (int[] arr : prerequisites) {
graph.get(arr[1]).add(arr[0]);
inDegree[arr[0]]++;
}
LinkedList<Integer> queue = new LinkedList<>();
for (int i = 0; i < inDegree.length; i++) {
if (inDegree[i] == 0) {
queue.add(i);
}
}
int count = 0;
while (!queue.isEmpty()) {
int curCourse = queue.removeFirst();
count++;
for (int adjCourse : graph.get(curCourse)) {
inDegree[adjCourse]--;
if (inDegree[adjCourse] == 0) {
queue.add(adjCourse);
}
}
}
return count == numCourses;
}
}