你这个学期必须选修?
numCourses
?门课程,记为?0
?到?numCourses - 1
?。在选修某些课程之前需要一些先修课程。 先修课程按数组?
prerequisites
?给出,其中?prerequisites[i] = [ai, bi]
?,表示如果要学习课程?ai
?则?必须?先学习课程??bi
?。
- 例如,先修课程对?
[0, 1]
?表示:想要学习课程?0
?,你需要先完成课程?1
?。请你判断是否可能完成所有课程的学习?如果可以,返回?
true
?;否则,返回?false
?。
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
List<List<Integer>> resources = new ArrayList<>();
int[] indegrees = new int[numCourses];
for (int i = 0; i < numCourses; i++){
resources.add(new ArrayList<>());
}
for (int[] nums : prerequisites){
indegrees[nums[0]]++;
resources.get(nums[1]).add(nums[0]);
}
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < numCourses; i++){
if(indegrees[i] == 0){
queue.add(i);
}
}
while (!queue.isEmpty()){
int val = queue.poll();
numCourses--;
for (int num : resources.get(val)){
if(--indegrees[num] == 0){
queue.add(num);
}
}
}
return numCourses == 0;
}
}