[算法题]课程表/课程表 II

news2024/9/29 19:16:38

题目链接: 

课程表

课程表 II

通过拓扑排序求解, 首先认识有向无环图:

入度表示有多少点指向自己, 出度表示自己指向多少点, 拓扑排序的思想则为选出入度为 0 的点排, 然后将被选出的点指向的点的入度减 1, 当入度被减到 0 时表示该点可以被选出, 一直循环直到全部点被选出或不存在入度为 0 的点.

拓扑排序大致步骤:

1. 建图

可以通过 STL 容器简单建图, 如: vector<vector<int>>, unordered_map<int, vector<int>>, 均表示一个点指向了其他几个点

2. 通过一个一维数组存储各个点的入度, 下标表示该点, 值表示入度

3. 定义一个队列, 将起始入度为 0 的点入队

4. 做一次 bfs, 因为队中的元素都是入度为 0 的点, 所以每次取出对头的点进行拓扑排序, 并同时将被该点指向的点的入度减减, 为 0 时入队, 以此往复直到队列为空

5. 最后判断保存入度的一维数组是否不存在入度大于 0 的点, 如果不存在表示拓扑排序成功, 反之表示存在环

题目中指出: [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi

表示 bi->ai,根据此规则建图,在建图的过程中同时保存各点的入度,再将入度为 0 的点入队,最后进行一次 bfs 即可,注意两道题非常相像,无非是对入度为 0 的点的处理方式不同,"课程表"这题无需对点进行特殊处理,只需在最后判断是否有环即可,"课程表 II"需要将点添加到一个 vector中,返回拓扑排序后的结果.

"课程表"题解代码:

class Solution 
{
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) 
    {
        unordered_map<int, vector<int>> edges; //建图
        vector<int> in(numCourses); //保存入度
        for(const auto& vv : prerequisites)
        {
            edges[vv[1]].push_back(vv[0]); //注意指向
            in[vv[0]]++; //更新入度
        }
        queue<int> q;
        //将当前入度为0的加入到队列
        for(int i = 0; i < numCourses; ++i)
        {
            if(!in[i])
            {
                q.push(i);
            }
        }
        //bfs
        while(!q.empty())
        {
            int n = q.front();
            q.pop();
            //更新入度,当经过减减后入度为0则添加到队列
            for(const auto& e : edges[n])
            {
                if(--in[e] == 0)
                {
                    q.push(e);
                }
            }
        }
        //判断是否存在环,有环返回false
        for(const auto& e : in)
        {
            if(e)
            {
                return false;
            }
        }
        return true;
    }
};

"课程表 II"题解代码:

class Solution 
{
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) 
    {
        vector<vector<int>> arr(numCourses); //建图
        vector<int> in(numCourses); //保存入度
        for(const auto& vv : prerequisites)
        {
            arr[vv[1]].push_back(vv[0]); //注意指向
            in[vv[0]]++; //更新入度
        }
        queue<int> q;
        //将当前入度为0的加入到队列
        for(int i = 0; i < numCourses; ++i)
        {
            if(!in[i])
            {
                q.push(i);
            }
        }
        vector<int> res; //保存拓扑排序后的结果
        //bfs
        while(!q.empty())
        {
            int n = q.front();
            q.pop();
            res.push_back(n);
            for(const auto& e : arr[n])
            {
                if(--in[e] == 0)
                {
                    q.push(e);
                }
            }
        }
        //判断是否存在环
        for(const auto& e : in)
        {
            if(e)
            {
                return {};
            }
        }
        return res;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

书生大模型实战营-基础关卡-2-8G 显存玩转书生大模型 Demo

Cli Demo 部署 InternLM2-Chat-1.8B 模型 先简单试试 InternLM2-Chat-1.8B 模型的能力 生成 300 字的小故事 我的prompt&#xff1a;写一个300字以内的小故事,故事符合中国特色. 模型输出&#xff1a;故事整体性还是很好的。 在一个小镇上&#xff0c;住着一只名叫小明的猫咪…

基于Dijkstra的校园导游系统

目录 一. 设计目的 二. 设计背景 三. 系统功能 四. 系统算法实现 五. 系统调试与结果分析 六. 完整源代码 一. 设计目的 通过设计并实现校园导游系统&#xff0c;使学生对数据结构有更深入的了解。该系统综合性非常广&#xff0c;能够极大提高学生的设计&#xff0c;编程及…

数据库中的约束,聚合函数以及联合查询

目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数&#xff08;查询&#xff09; 分组 联表查询&#xff08;多表查询&#xff09; 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…

用python获取系统的硬件信息(python实例二十九)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.获取系统信息 3.1 代码构思 3.2 代码示例 3.3 运行部分结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…

计算机组成原理面试-核心概念-问题理解

目录 1.怎么理解计算机组成原理中存储器、控制器、运算器、输入输出设备之间的协作关系和工作流程 2.比、比特等类似几种表示信息存储的单位具体换算 3.介绍计算机的五大功能-数据传送功能、数据存储功能、数据处理功能、操作控制功能、操作判断功能 4.计算机的工作过程/指令…

【Linux基础】Linux基本指令(一)

目录 前言1&#xff0c; ls指令2&#xff0c;pwd指令三&#xff0c;cd指令3.1 当前目录与上级目录3.2 绝对路径和相对路径3.3 tree指令 四&#xff0c;创建一个普通文件或目录4.1 touch指令4.2 mkdir指令 五&#xff0c;删除目录或文件5.1 rmdir指令5.2 rm 指令 六&#xff0c;…

华大基因阿尔茨海默病风险基因检测,助力阿尔茨海默病早预防

中国正面临日益加剧的老龄化挑战。据统计&#xff0c;2020年我国60岁以上的老年人口已达2.6亿&#xff0c;其中轻度认知障碍患者超过3800万&#xff0c;而阿尔茨海默病患者近千万。随着这一趋势的延续&#xff0c;如何早期发现和预防阿尔茨海默病已成为公共卫生领域的重要议题。…

为什么建议从二维向三维GIS开发方向拓展?

GIS开发是地理信息系统领域中一个薪资待遇较高的职业方向&#xff0c;吸引了众多来自测绘、遥感和城市规划等相关专业的学生转型投身于WebGIS开发工作。 那么&#xff0c;今天从技术角度出发&#xff0c;探讨为何鼓励大家超越WebGIS的范畴&#xff0c;继续深入学习三维GIS开发…

el-date-picker 限制开始时间和结束时间

el-date-picker 限制开始时间和结束时间 需求&#xff1a;el-date-picker 月份限制开始时间和结束时间 开始时间&#xff1a;202307 结束时间&#xff1a;202407 代码实现 vue 页面 <el-form-item label"月份" prop"monthList"><el-date-picker …

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…

测试概论之系统测试

系统测试 文章目录 系统测试一、系统测试定义二、系统测试的对象三、系统测试类型1、功能测试2、性能测试3、压力测试4、容量测试5、GUI 测试6、可以性测试7、安装性测试8、配置测试9、异常测试10、备份测试11、健壮性测试12、文档测试13、在线帮助测试14、网络测试 四、系统测…

为什么奥运会采用通义而不是 OpenAI,现在中国的 AI 技术是世界领先了吗?

奥运会作为全球最盛大的体育赛事之一&#xff0c;一直在不断地引入和利用最新的科技来提升赛事的组织效率、观众体验以及运动员的表现。在2024年巴黎奥运会上&#xff0c;人工智能&#xff08;AI&#xff09;技术的应用尤为引人注目。 首先&#xff0c;关于奥运会采用的技术选…

数字噪音计(声级计)【AR814数字噪音计】

系统介绍 声级计&#xff0c;又叫噪音计&#xff0c;是噪声测量中最基本的仪器。声级计一般由电容式传声器、前置放大器、衰减器、放大器、频率计权网络以及有效值指示表头等组成。 声级计的工作原理是&#xff1a;由传声器将声音转换成电信号&#xff0c;再由前置放大器放大…

【json解析】控制台打印json字符串格式正确,但json.loads()解析失败问题解决

问题为控制台打印json字符串格式正确&#xff0c;但json.loads()解析失败。看似简单的问题&#xff0c;却又折腾了好一会&#xff0c;因此记录一下解决方法&#xff01; 出现这个问题的原因&#xff1a;眼见不一定为实&#xff0c;控制台打印的json字符串并不一定是实际的json字…

Typora v1.9.5解锁版下载、安装教程 (轻便简洁的Markdown编辑器)

前言 Typora是一款轻便简洁的Markdown编辑器&#xff0c;支持即时渲染技术&#xff0c;这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如&#xff0c;不像其他编辑器的有编辑栏和显示栏。 一、下载地址 下载链接&#xff1a;…

软件测试---Fiddler抓包

一、初识Fiddler ①BS架构简介和请求过程理解 ②Fiddler原理 Fiddler是一个代理服务器。代理地址:127.0.0.1&#xff0c;端口:8888。浏览器可以通过设置查看代理服务器&#xff1a;设置->高级->打开您计算机的代理设置->连接->局域网设置->代理服务器->在高级…

Vulnhub靶场-FRISTILEAKS: 1.3

1.环境准备 下载地址&#xff1a;https://www.vulnhub.com/entry/fristileaks-13,133/ 攻击机&#xff1a;kali&#xff08;192.168.26.128&#xff09; 靶机&#xff1a;FRISTILEAKS: 1.3 将靶机和kali的网络连接模式设置为同一种模式&#xff08;Nat模式&#xff09; 注…

【linux】linux中特殊权限管理--FACL详细用法教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

MM 14 -采购- 固定资产采购

思维导图 说明 特点&#xff1a; 价值大于2000就算固定资产采购。 不做料号管理 不做库存管理 但是财务做资产卡片管理 流程&#xff1a; 01采购申请意向表---02资产评估表--03财务创建资产卡片AS01--04创建采购申请&#xff08;科目分配类别A&#xff09;--05采购订单--06…

不学函数式设计的3大损失

讲动人的故事&#xff0c;写懂人的代码 可能很多程序员和我一样&#xff0c;一直在一次次地重新入门函数式编程&#xff08;和设计&#xff09;。因为我们总是学了就忘。 鲍叔去年出版了他的大作《函数式设计》&#xff0c;里面有大量Clojure代码示例。如果不懂Clojure&#x…