LeetCode 207. 课程表
题目描述
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。
例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。
示例 1:
输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
提示:
1 <= numCourses <= 105
0 <= prerequisites.length <= 5000
prerequisites[i].length == 2
0 <= ai, bi < numCourses
prerequisites[i] 中的所有课程对 互不相同
一、解题关键词
课程有先后学习顺序 想要学够 需要堆所有课程进行遍历
二、解题报告
1.思路分析
2.时间复杂度
3.代码示例
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[] indegree = new int[numCourses];
List<List<Integer>> grapList = new ArrayList<>();
Queue<Integer> queue = new LinkedList<Integer>();
for(int i = 0; i< numCourses;i++){
grapList.add(new ArrayList<>());
}
for(int [] cp : prerequisites){
indegree[cp[0]]++;
grapList.get(cp[1]).add(cp[0]);
}
for(int i = 0;i < numCourses;i++){
if(indegree[i] == 0){
queue.add(i);
}
}
while(!queue.isEmpty()){
int pre = queue.poll();
numCourses --;
for(int cur : grapList.get(pre)){
if(--indegree[cur] == 0){
queue.add(cur);
}
}
}
return numCourses == 0;
}
}
2.知识点
考察拓扑排序 可以使用深度优先 ||广度优先进行实现
该博客介绍了LeetCode第207题的解决方案,即如何判断给定课程表中是否存在先修课程关系并能完成所有课程的学习。博主通过广度优先搜索(BFS)实现拓扑排序,检查是否存在环并确定是否能完成所有课程。
873

被折叠的 条评论
为什么被折叠?



