/*
bfs:1建立一个array list数组 每一个list用于储存当前位置所有进阶课程 (大小为 numcourse)
2建立一个数组 储存当前位置需要的基础课程个数;(大小为numcourse)
3建立一个count 记录可以完成课程的个数 用于最后与总课程数进行比较
4建立一个queue 进行层级遍历;
先把2 步骤中 值为0 的位置拿出来存入queue 中 然后开始层级遍历,每次poll的课程 找到他的进阶课程list进行筛选 如果数组中 此课程所需要的基础课程数值为0 则说明已经可以学习这门课程 那么就把它放入queue中,以此方法遍历 每次poll时count➕1 直到遍历结束 比对count的值是否等于numcourse则可以得出结论;
注意: ArrayList的 get() 方法返回的是element 所以需要强制转换成int;
*/
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
List[] postCourses = new ArrayList[numCourses];
int[] degrees = new int[numCourses];
int count = 0;
Queue<Integer> q = new LinkedList<>();
//先给list中每个都赋一个空值;
for(int i = 0; i < numCourses; i++) {
postCourses[i] = new ArrayList<Integer>();
}
for(int i = 0; i < prerequisites.length; i++) {
postCourses[prerequisites[i][1]].add(prerequisites[i][0]);
degrees[prerequisites[i][0]]++;
}
for(int i = 0; i < numCourses; i++) {
if(degrees[i] == 0) {
q.offer(i);
}
}
while(!q.isEmpty()) {
int temp = q.poll();
count++;
for( int i = 0; i < postCourses[temp].size(); i++) {
int prevCourse = (int)postCourses[temp].get(i);
degrees[prevCourse]--;
if(degrees[prevCourse] == 0) {
q.offer(prevCourse);
}
}
}
return count == numCourses;
}
}