首页 > 其他分享 >207. 课程表(中)

207. 课程表(中)

时间:2023-12-25 15:55:24浏览次数:33  
标签:207 入度 numCourses 课程 result 课程表 节点 indeg

目录

题目

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

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

    例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
    请你判断是否可能完成所有课程的学习?如果可以,返回 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 。这是不可能的。

题解:BFS

  • 利用有向无环图的入度。用一个字典存储节点(课程)和入度,每次将入度为0的加入队列,并且将后续课程的入度-1,每学完一门课就计数++。最后返回计数==课程数
class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        #用字典存储有向图
        edges = collections.defaultdict(list)
        #存储每个节点的入度
        indeg = [0] * numCourses
        result = 0
        # 初始化有向图的边和节点的入度
        for info in prerequisites:
            edges [info [1]].append(info[0])   # 将后续课程添加到前置课程的边列表中,建立了一个从前置课程指向后续课程的有向边。
            indeg [info[0]]+=1   # 每当一个课程作为后续课程出现时,它的入度就会加 1。
        # 创建一个双端队列,将入度为 0 的节点加入队列中
        q = collections.deque([u for u in range(numCourses) if indeg[u] == 0])
        # 进行拓扑排序的过程
        while q:
            u=q.popleft()  # 取出队列中的节点
            result += 1  # 学完一门课程,result +1
            # 遍历节点 u 的后续课程
            for v in edges [u]:
                indeg [v] -= 1# 将后续课程的入度 -1
                if indeg[v] == 0:# 如果后续课程的入度为 0,将其加入队列
                    q.append(v)
        return result == numCourses  # 判断是否完成了所有课程

210.课程表Ⅱ

  • 要求返回学习课程的顺序,其他条件同上

  • 只需要把上面的统计课程的result换成列表,学完一门课就加入到result列表中,最后返回result列表

class Solution:
    def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
        #用字典存储有向图
        edges = collections.defaultdict(list)
        #存储每个节点的入度
        indeg = [0] * numCourses
        result = list()
        # 初始化有向图的边和节点的入度
        for info in prerequisites:
            edges [info [1]].append(info[0])   # 将后续课程添加到前置课程的边列表中,建立了一个从前置课程指向后续课程的有向边。
            indeg [info[0]]+=1   # 每当一个课程作为后续课程出现时,它的入度就会加 1。
        # 创建一个双端队列,将入度为 0 的节点加入队列中
        q = collections.deque([u for u in range(numCourses) if indeg[u] == 0])
        # 进行拓扑排序的过程
        while q:
            u=q.popleft()  # 取出队列中的节点
            result.append(u)  # 学完一门课程,result +1
            # 遍历节点 u 的后续课程
            for v in edges [u]:
                indeg [v] -= 1  # 将后续课程的入度 -1
                if indeg[v] == 0:  # 如果后续课程的入度为 0,将其加入队列
                    q.append(v)
        if len(result) != numCourses:  # 如果结果列表中的课程数量不等于总课程数,说明无法完成所有课程
            result=list() # 将结果列表置空
        return result  # 判断是否完成了所有课程

标签:207,入度,numCourses,课程,result,课程表,节点,indeg
From: https://www.cnblogs.com/lushuang55/p/17926068.html

相关文章

  • DB207S-ASEMI迷你贴片整流桥DB207S
    编辑:llDB207S-ASEMI迷你贴片整流桥DB207S型号:DB207S品牌:ASEMI封装:DBS-4最大平均正向电流:2A最大重复峰值反向电压:1000V产品引线数量:4产品内部芯片个数:4产品内部芯片尺寸:55MIL峰值正向漏电流:<10ua恢复时间:>2000ns浪涌电流:50A芯片材质:光阻GPP最大正向电压:1.10V工作结温:-55℃~150℃包装......
  • DB207S-ASEMI迷你贴片整流桥DB207S
    编辑:llDB207S-ASEMI迷你贴片整流桥DB207S型号:DB207S品牌:ASEMI封装:DBS-4最大平均正向电流:2A最大重复峰值反向电压:1000V产品引线数量:4产品内部芯片个数:4产品内部芯片尺寸:55MIL峰值正向漏电流:<10ua恢复时间:>2000ns浪涌电流:50A芯片材质:光阻GPP最大正向电压:1.10V工作结温......
  • [20231207]开发不应该这样写sql4.txt
    [20231207]开发不应该这样写sql4.txt--//最近在优化sql语句,发现另外一种风格,实际上以前也遇到过,感觉这就像一种病,会传染只要一个这样写后面的要么跟进要么--//不改。我觉得开发应该感谢exadata,不然我们的生产系统估计会垮掉。1.环境:XXXXXX>@ver1PORT_STRING          ......
  • 20231207
    今天上课完成的测试 个人观点非正确答案 软件需求与分析课堂测试之九-面向对象设计与分析      阅读下列图和文字材料 ,回答问题1至问题3。某物品拍卖网站为参与者提供物品拍卖平台,组织拍卖过程,提供在线或线下交易服务。网站的主要功能描述如下:(1)拍卖参与者分......
  • 每日总结20231207
    代码时间(包括上课)5h代码量(行):100行博客数量(篇):1篇相关事项:1、今天是周四,这周的课到此结束,上课的随堂测试也是回答的十分顺利,全部正确,并且在最后的一节课上查了软件设计师的成绩,让人十分高兴,我顺利的通过了,而且每科均达到五十分以上。2、今天下午的时候把我们班的发展团员的相关......
  • 每日总结_20231207
    UML(UnifiedModelingLanguage)是一种用于软件系统建模的标准化语言,它提供了一组图形符号和规范,以便开发人员可以更好地理解、设计和构建复杂的软件系统。UML包括多种图表,每种图表都有不同的目的和应用场景。1.用例图(UseCaseDiagrams)特点:用例(UseCase)是描述系统功能的一......
  • 21207119-第三次java博客
    前言第三次博客,主要是成绩系统和期末考试题量:不是太大,小题写的会快些,但是系列题找测试点的过程有时候很费时间难度:中等偏上,包含了诸多细节和需求,包括各种异常处理和特殊情况的处理测试与分析7-1容器-HashMap-检索分数10全屏浏览题目切换布局作者 蔡......
  • 21207328-吴义隆-Blog2
    一、前言:(1)知识点本次作业,知识点很广,单论期中考试,就涉及了许多,类结构设计、继承与多态和抽象类与接口等。Java类结构知识点:类的声明:Java类通过关键字"class"来声明,后面跟着类名和类体,类体包含类的成员变量和方法。成员变量:也称为字段或属性,用于描述类的状态。它们定......
  • 菜单点菜2-5次以及期中考试分析-21207310姜昊
    本次分析菜单2-4,以及期中考试题目,总体来说题目有一定难度,但仍可完成,主要从菜单1过度到2,3时要确定好方向,否则会产生一些无法解决的问题7-4菜单计价程序-2分数:38输入样例:在这里给出一组输入。例如:麻婆豆腐12油淋生菜91麻婆豆腐222油淋生菜13end输出样例:在这......
  • 21207106-xuesong
    菜单系列题及期中总结一、前言这次博客是主要对菜单系列题目和期中题目总结,菜单系列题目包括菜单计价程序-3、菜单计价程序-4、菜单计价程序-5,菜单系列题目,主要是考察对类的创建,怎么设计合适的类,类与类之间的关系,考察了封装,继承,依赖等。其次是考察对正则表达式判断输入格......