题目
你这个学期必须选修
numCourses
门课程,记为0
到numCourses - 1
。在选修某些课程之前需要一些先修课程。 先修课程按数组
prerequisites
给出,其中prerequisites[i] = [ai, bi]
,表示如果要学习课程ai
则 必须 先学习课程bi
。
- 例如,先修课程对
[0, 1]
表示:想要学习课程0
,你需要先完成课程1
。请你判断是否可能完成所有课程的学习?如果可以,返回
true
;否则,返回false
。
解题思路
- 以课程id进行整理数据,收集需要当前课程作为前置课程的课程;
- 从不需要前置课程的课程进行清除数据;
- 若课程数量最后清为0则可以学完所有课程,否则则不可以。
代码展示
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;
}
}