LeetCodeDiary

A Diary for solving LeetCode problems

View on GitHub

207. 课程表

你这个学期必须选修 numCourses 门课程,记为 0numCourses - 1

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai必须 先学习课程 bi

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。

示例 2:

输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
输出:false
解释:总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。

提示:

DFS 中等

拓扑排序/DFS 求解

代码

1 . 自己写的拓扑排序

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        Graph = defaultdict(set) # 有向图
        ioD = defaultdict(lambda :[0,0]) # 出入度统计
        courses = set()
        for course in prerequisites:
            courses.add(course[0]), courses.add(course[1])
            Graph[course[0]].add(course[1]) 
            ioD[course[0]][0] += 1 # course[0] 出度 + 1
            ioD[course[1]][1] += 1 # course[1] 入度 + 1
        zeroIn = [] # 用于维护入度为0的节点
        for key, val in ioD.items():
            if val[1] == 0:
                zeroIn.append(key)
        allCourses = set([i for i in range(numCourses)])
        ans = list(allCourses - courses)
        while zeroIn:
            ans.insert(0,zeroIn.pop())
            for n in Graph[ans[0]]:
                ioD[n][1] -= 1
                if ioD[n][1] == 0:
                    zeroIn.append(n)
        return True if len(ans) == numCourses else False

2. DFS

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        def dfs(i, adjacency, flags):
            if flags[i] == -1: return True
            if flags[i] == 1: return False
            flags[i] = 1
            for j in adjacency[i]:
                if not dfs(j, adjacency, flags): return False
            flags[i] = -1
            return True

        adjacency = [[] for _ in range(numCourses)]
        flags = [0 for _ in range(numCourses)]
        for cur, pre in prerequisites:
            adjacency[pre].append(cur)
        for i in range(numCourses):
            if not dfs(i, adjacency, flags): return False
        return True