Solution URL
https://leetcode.com/submissions/detail/414622173/
代码
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//ans: https://www.youtube.com/watch?v=oa6uR2yNG_s
int[] indegree = new int[numCourses];
//统计入度
for(int[] pairs: prerequisites){
indegree[pairs[0]]++;
}
Queue<Integer> queue = new LinkedList<>();
//入度为0,入队(即不需要前置课)
for(int i = 0; i < numCourses ; i++){
if(indegree[i] == 0) queue.offer(i);
}
//比较课程号和入度的关系,更新入度的值
while(!queue.isEmpty()){
//入度为0的课程号
int cur = queue.poll();
for(int[] pairs: prerequisites){
//当前课程入度为0,跳过
if(indegree[pairs[0]] == 0) continue;
//入度为0的课程号,刚好是当前课程的先修课,则入度-1
if(cur == pairs[1]) indegree[pairs[0]]--;
if(indegree[pairs[0]] == 0) queue.offer(pairs[0]);
}
}
//仍然有入度不为0(有先修课没有修完)
for(int i = 0; i < numCourses; i++){
if(indegree[i] != 0) return false;
}
return true;
}
}