207. 课程表 【中等题】【拓扑排序】
现在你总共有 n 门课需要选,记为 0 到 n-1。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]
给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?
输入: 2, [[1,0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
输入: 2, [[1,0],[0,1]]
输出: false
解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。
题目讲解
【历史重难点题目】
【核心思想】
- 不断删除入度为0的结点,直到无法删除为止
【数据结构】
- 数组,链表,队列
【思路】
- 将每个课看成一个结点,将各个结点的入度存在数组里
- 将各个结点之间的关系,以邻接链表的形式存储下来
- 不断删除入度为0的结点,直到无法删除为止
- 判断最后是否还剩下结点,若还剩下,则有环,不能完成所有课程的学习;若没有剩下,则无环,能完成所有课程的学习
【代码】
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[] indegree=new int[numCourses];
List[] list=new ArrayList[numCourses];
for(int i=0;i