LeetCode 算法:课程表 c++
原题链接🔗:课程表
难度:中等⭐️⭐️
题目
你这个学期必须选修 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 。这是不可能的。
提示:
1 <= numCourses <= 20000 <= prerequisites.length <= 5000prerequisites[i].length == 20 <= ai, bi < numCoursesprerequisites[i]中的所有课程对 互不相同
拓扑排序
拓扑排序是图论中的一个概念,它对有向无环图(DAG,Directed Acyclic Graph)中的顶点进行线性排序,使得对于任何一条有向边
U -> V,顶点U都在顶点V的前面。这种排序不是唯一的。拓扑排序常用于任务调度、课程规划等场景。以下是拓扑排序的一般步骤:
计算所有顶点的入度:入度是指有多少条边指向该顶点。对于图中的每个顶点,初始化一个计数器来记录入度。
将所有入度为0的顶点加入队列:入度为
0的顶点表示没有依赖,可以首先进行排序。处理队列中的顶点:
- 从队列中移除一个顶点,并将其加入到拓扑排序的结果列表中。
- 遍历该顶点的所有邻接点,将每个邻接点的入度减1(因为它们的一个依赖已经完成)。
- 如果某个邻接点的入度变为
0,将其加入队列。重复步骤3,直到队列为空。
检查环:如果拓扑排序的结果列表中的顶点数量等于原始图中的顶点数量,则图中没有环;否则,存在环,无法完成拓扑排序。
拓扑排序的算法可以用多种方式实现,包括Kahn算法和DFS(深度优先搜索)。
拓扑排序的时间复杂度通常是 O(V+E),其中 V 是顶点数,E 是边数。空间复杂度为 O(V),用于存储访问状态和排序结果。
题解
- 解题思路:
LeetCode 上的 “课程表” 问题(问题编号207)是一个典型的图论问题,主要考察了图的深度优先搜索(DFS)和拓扑排序的应用。
以下是这个问题的解题思路:
理解问题:首先,明确题目要求我们判断是否能够完成所有课程的学习。这等价于判断图中是否存在环,因为如果存在环,则表示有课程无法满足其所有先修条件。
构建图:根据给定的先修关系列表 prerequisites 构建一个有向图。可以使用邻接表来表示这个图,其中每个节点代表一门课程,边表示先修关系。
检测环:使用深度优先搜索(DFS)来检测图中是否存在环。在DFS过程中,使用两个集合来记录访问状态:
- visited:记录已经访问过的节点。
- recStack(递归栈):记录当前递归路径上的节点,用于检测环。
DFS逻辑:
- 对于每个未访问的节点,执行DFS。
- 如果当前节点已经在 recStack 中,表示找到了一个环,返回 false。
- 如果当前节点已经访问过,并且不在 recStack 中,可以跳过。
- 将当前节点加入 visited 和 recStack。
- 对当前节点的所有邻接节点递归执行DFS。
- 递归返回后,将当前节点从 recStack 中移除。
拓扑排序:如果所有节点都可以通过DFS访问且没有检测到环,那么图是可拓扑排序的,即可以完成所有课程的学习。
- c++ demo:
#include <iostream>
#include <vector>
#include <queue>using namespace std;class Solution {
public:bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {vector<int> indegrees(numCourses, 0);vector<vector<int>> graph(numCourses);// 构建图并计算入度for (auto& pre : prerequisites) {graph[pre.first].push_back(pre.second);indegrees[pre.second]++;}// 拓扑排序vector<int> topsort;queue<int> q;for (int i = 0; i < numCourses; ++i) {if (indegrees[i] == 0) {q.push(i);}}while (!q.empty()) {int course = q.front();q.pop();topsort.push_back(course);for (int pre : graph[course]) {indegrees[pre]--;if (indegrees[pre] == 0) {q.push(pre);}}}// 如果所有课程都被排序了,图中没有环return topsort.size() == numCourses;}
};int main() {Solution solution;// 测试用例vector<pair<int, int>> prerequisites = { {1, 0}, {0, 1} };int numCourses = 4;bool result = solution.canFinish(numCourses, prerequisites);if (result) {cout << "It is possible to finish all courses." << endl;}else {cout << "It is not possible to finish all courses." << endl;}return 0;
}
- 输出结果:
It is not possible to finish all courses.
- 代码仓库地址:canFinish
相关文章:
LeetCode 算法:课程表 c++
原题链接🔗:课程表 难度:中等⭐️⭐️ 题目 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i]…...
前端面试题30(闭包和作用域链的关系)
闭包和作用域链在JavaScript中是紧密相关的两个概念,理解它们之间的关系对于深入掌握JavaScript的执行机制至关重要。 作用域链 作用域链是一个链接列表,它包含了当前执行上下文的所有父级执行上下文的变量对象。每当函数被调用时,JavaScri…...
A股本周在3000点以下继续筑底,本周依然继续探底?
夜已深,市场传来了3个浓烈的消息,炸锅了,恐有大事发生,马上告诉所有人: 消息面: 1、中国经济周刊首席评论员钮文新称:不要等中小投资者都彻底希望,销户离场了,才发现该…...
Javadoc介绍
Javadoc 是用于生成 Java 代码文档的工具。它利用特定的注释格式,将 Java 源代码中的注释提取出来,并生成 HTML 文档。Javadoc 注释通常位于类、接口、构造函数、方法和字段的声明之前,以 /** 开始,以 */ 结束。以下是 Javadoc 注释的一些主要元素和使用方法: 基本语法 …...
C# Application.DoEvents()的作用
文章目录 1、详解 Application.DoEvents()2、示例处理用户事件响应系统事件控制台输出游戏和多媒体应用与操作系统的交互 3、注意事项总结 Application.DoEvents() 是 .NET 框架中的一个方法,它主要用于处理消息队列中的事件。在 Windows 应用程序中,当一…...
IDEA如何创建原生maven子模块
文件 -> 新建 -> 新模块 -> Maven ArcheTypeMaven ArcheType界面中的输入框介绍 名称:子模块的名称位置:子模块存放的路径名创建Git仓库:子模块不单独作为一个git仓库,无需勾选JDK:JDK版本号父项:…...
LCD EMC 辐射 测试随想
最近做几个产品过认证。 有带2.8寸 MCU8080接口的小屏(320 X 240),也有RGB接口的10.1寸的大屏(800*600). 以下为个人随想,不知道是否正确,仅作记录。 测试发现辐射的核心问题还是在于时钟及其倍频所产生的尖峰。 记得读…...
Docker安装遇到问题:curl: (7) Failed to connect to download.docker.com port 443: 拒绝连接
问题描述 首先,完全按照Docker官方文档进行安装: Install Docker Engine on Ubuntu | Docker Docs 在第1步:Set up Dockers apt repository,执行如下指令: sudo curl -fsSL https://download.docker.com/linux/ubu…...
阿里云安装rabbitMQ
1、首先看linux 版本 uname -a如果时centos 7 可以参考其他文档。我这里是centos 8 这个很重要 。网上全是按centos7 按照。导致我前面一直安装不上 各种问题。 2、查看rabbitmq 对应 erl 的版本下载 https://www.rabbitmq.com/docs/which-erlang 选择rabbitmq 3.11.19 选择…...
中文大模型基准测评2024上半年报告
中文大模型基准测评2024上半年报告 原创 SuperCLUE CLUE中文语言理解测评基准 2024年07月09日 18:09 浙江 SuperCLUE团队 2024/07 背景 自2023年以来,AI大模型在全球范围内掀起了有史以来规模最大的人工智能浪潮。进入2024年,全球大模型竞争态势日益加…...
新火种AI|OpenAI的CEO又有新动作?这次他成立了AI健康公司
作者:一号 编辑:美美 AI技术即将改变医疗健康市场。 就在前两天,人工智能和医疗健康领域迎来了一个重要时刻。OpenAI的CEO萨姆阿尔特曼(Sam Altman)与Thrive Global的CEO阿里安娜赫芬顿(Arianna Huffing…...
中介子方程五十
XXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXuXXWXXuXXdXXrXXαXXuXpX…...
如何借助社交媒体影响者的力量,让品牌影响力倍增?
一、引言:为何社交媒体影响者如此关键? 在信息爆炸的今天,社交媒体已成为塑造消费者行为与品牌认知的重要渠道。社交媒体影响者,凭借其在特定领域的专业知识、庞大的粉丝基础及高度的互动性,成为了品牌传播不可忽视的…...
Python面试题:Python 中的 `property` 函数有什么用?
在 Python 中,property 函数用于创建和管理类中的属性。它允许你将方法转换为属性,这样你可以像访问变量一样访问这些方法。这对于控制属性的访问和修改非常有用,因为它允许你在属性访问时执行额外的逻辑(如验证或计算)…...
十五、小型电脑没有数字键及insert,怎么解决IDEA快速插入getset构造这些方法
🌻🌻目录 一、小型电脑没有数字键及insert,怎么解决IDEA快速插入getset构造这些方法 一、小型电脑没有数字键及insert,怎么解决IDEA快速插入getset构造这些方法 解决: 1.winR打开搜索 2.osk回车 屏幕就出现了这样的一…...
【鸿蒙学习笔记】属性学习迭代笔记
这里写目录标题 TextImageColumnRow Text Entry Component struct PracExample {build() {Row() {Text(文本描述).fontSize(40)// 字体大小.fontWeight(FontWeight.Bold)// 加粗.fontColor(Color.Blue)// 字体颜色.backgroundColor(Color.Red)// 背景颜色.width(50%)// 组件宽…...
工具推荐:滴答清单
官网地址:DIDA:Todo list, checklist and task manager app for Android, iPhone and Web 使用近一个月,特别方便,使用感受非常棒,功能全面。 我主要用了以下功能: 1、每日事项提醒:写作,背字…...
阶段三:项目开发---大数据开发运行环境搭建:任务4:安装配置Spark集群
任务描述 知识点:安装配置Spark 重 点: 安装配置Spark 难 点:无 内 容: Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop …...
SDIO CMD 数据部分 CRC 计算规则
使用的在线 crc 计算工具网址:http://www.ip33.com/crc.html CMD CRC7 计算 如下图为使用逻辑分析仪获取的SDIO读写SD卡时,CMD16指令发送的格式,通过逻辑分析仪总线分析,可以看到,该部分的CRC7校验值得0x05,大多数情况…...
每日一编程,早点拿offer
计算字符串最后一个单词的长度,单词以空格隔开 输入描述: 输入一行,代表要计算的字符串,非空 输出描述: 输出一个整数,表示输入字符串最后一个单词的长度。 输入:hello world输出:…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
