课程表
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。
例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false
from collections import deque
class Solution(object):
def canFinish(self, numCourses, prerequisites):
"""
:type numCourses: int
:type prerequisites: List[List[int]]
:rtype: bool
"""
pre_num = [0 for _ in range(numCourses)]#用来存储下标对应的科目需要的先决课程数目
cur_need = [[] for _ in range(numCourses)]#用二维数组下标表示pre,每一个pre下表对应一个数组,这个数组里面存储所有以pre为先修课程的科目
for cur, pre in prerequisites:
pre_num[cur] += 1
cur_need[pre].append(cur)
queue = deque()
for i in range(numCourses):
if not pre_num[i]:
queue.append(i)
while queue:
pre = queue.popleft()
numCourses -= 1
for cur in cur_need[pre]:#因为pre被pop掉了,所以要把所有以它为先修课程的科目数减一
pre_num[cur] -= 1#
if not pre_num[cur]:
queue.append(cur)
return not numCourses