Leetcode 207. 课程表
题目要求:
现在你总共有 n 门课需要选,记为
0
到n-1
。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:
[0,1]
给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?
示例:
输入: 2, [[1,0]] 输出: true 解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
算法:
- 构建:统计入度indegree,使用邻接表法构建有向图
- 借助一个deque,将所有indegree的点入队
- 当deque不为空时,将队首元素出队,并且对与其邻接的点的入度减一
- 如果邻接点的入度为0,将其入队
- 每次出队的时候,numcourses减一
- 如果numcourses == 0 说明课程表可以成功安排
实现:
class Solution(object):
def canFinish(self, numCourses, prerequisites):
"""
:type numCourses: int
:type prerequisites: List[List[int]]
:rtype: bool
"""
indegree = [0 for _ in range(numCourses)]
adj = [[] for _ in range(numCourses)]
que = []
for idx in prerequisites:
cur = idx[0]
pre = idx[1]
indegree[cur] += 1
adj[pre].append(cur)
for i in range(len(indegree)):
if not indegree[i]:
que.append(i)
while len(que) > 0:
pre = que.pop()
numCourses -= 1
for course in adj[pre]:
indegree[course] -= 1
if not indegree[course]:
que.append(course)
return not numCourses