美文网首页
LeetCode 207. 课程表

LeetCode 207. 课程表

作者: 草莓桃子酪酪 | 来源:发表于2022-09-02 04:37 被阅读0次
题目

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。

  • 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
    请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

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

方法:拓扑排序
  • inDegree 存储每门课的入度,初始化为零; relationDict 以字典的形式记录每门课的后续课程,key 表示课程,value 表示该课程的后续课程,用 list 表示
  • 循环遍历 prerequisites
    • 计算每门课的入度
    • 记录课与课间的关系
  • queue 为双向队列,存储当前入度为零的课程
  • 循环遍历 inDegree,将入度为零的课程放入队列 queue
  • 循环直至队列为空
    • current 存储当前课程,通过将双向队列的最左输出得到
    • 选修当前课程 current,那么选修课程数量 numCourses 减一
    • 获取当前选修课程 current 的关系,即该课程的后继课程
    • 若存在后继课程,那么将其所有的后继课程的入度减一,并判断此时的入度是否为零,若为零,表示该课程已可以被选修,将其加入队列 queue
  • 若所有课程已被选修,即 numCourses 为零,那么返回 True;否则,返回 False
class Solution(object):
    def canFinish(self, numCourses, prerequisites):
        from collections import deque

        inDegree = [0] * numCourses
        relationDict = collections.defaultdict(list)

        for course in prerequisites:
            inDegree[course[0]] += 1
            relationDict[course[1]].append(course[0])
        
        queue = deque()
        for i in range(len(inDegree)):
            if inDegree[i] == 0:
                queue.append(i)
        
        while queue:
            current = queue.popleft()
            numCourses -= 1
            relation = relationDict[current]
            if relation:
                for course in relation:
                    inDegree[course] -= 1
                    if inDegree[course] == 0:
                        queue.append(course)
        
        return numCourses == 0
相关知识
  • 双向队列: collections.deque()
参考

代码相关:https://leetcode.cn/problems/course-schedule/solution/bao-mu-shi-ti-jie-shou-ba-shou-da-tong-tuo-bu-pai-/
deque:https://www.cnblogs.com/ranzhong/p/12438841.html

相关文章

  • LeetCode-207-课程表

    LeetCode-207-课程表 207. 课程表[https://leetcode-cn.com/problem...

  • LeetCode 207. 课程表 | Python

    207. 课程表 题目来源:力扣(LeetCode)https://leetcode-cn.com/problem...

  • LeetCode 207. 课程表

    题目 207. 课程表 题目描述 现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先...

  • LeetCode 207. 课程表

    1、题目 课程表 - 力扣(LeetCode) https://leetcode-cn.com/problems/...

  • LeetCode 207. 课程表

    题目 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课...

  • 2019-01-21

    LeetCode 207. Course Schedule Description There are a tot...

  • 77. 组合/207. 课程表

    77. 组合 相关标签:回溯算法 207. 课程表 相关标签: DFS BFS 图 拓扑排序

  • 207.课程表!

    本题是一道拓扑排序的问题,个人感觉难度还是挺大的,即便写出来也感觉有些似懂非懂。另外我个人认为本题并没有使用传统的...

  • 207. 课程表

    完全考察拓扑排序的。

  • 207. 课程表

    解法 深度优先遍历解法 广度优先解法

网友评论

      本文标题:LeetCode 207. 课程表

      本文链接:https://www.haomeiwen.com/subject/pdctnrtx.html