【力扣每日一题】2023.9.9 课程表

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一些课程的先修关系,也就是有些课我们需要先去学其他的课程才能学习,问我们是否可以学习完所有的课程。

这道题和LeetCode75系列的第四十三题钥匙和房间很类似,不过不一样的是本题中题目没有告诉我们一开始学习的课程是什么,也就是说我们可以先学习所有没有先修关系的课程,然后再看看能不能学完所有的课程。

我们可以将课程的先修关系转变为有向图,然后我们就可以很清晰的发现,不能学完所有课程的情况只有一种,那就是有向图中有环。

我个人喜欢DFS,所以以下代码是DFS。

首先先用题目给出的先修关系构建出有向图,我这边用的是map,用邻接矩阵也是可以的。

构建完毕之后我们去遍历每个科目,再对每个科目用递归去寻找它们的先修科目以及先修科目的先修科目,如果找到了和自身一样的科目,那么就表示找到了图中的环,即我们不能学完所有科目。

在递归的时候我们需要传入当前递归的科目,以及初始的科目,还有一个已经遍历过的科目数组。如果当前的科目等于初始的科目,那么找到环。如果递归到了之前遍历过的科目,那么我们并不能说明找到了环,并且由于之前是递归过这个科目的,所以也要退出本次循环。

可能有小伙伴会有疑惑,如果我们递归到了之前遍历过的科目,那么不是说明我们又绕回去了,也是有环的吗?为什么说不能说明找到了环呢?

一般情况下是有环的,但是有个特殊情况,就是下面这样:

A的先修课程是B和C,而C的先修课程是B。我们可以先修B然后C最后A,最终是可以学完所有课程的,

但如果我们递归到之前递归过的课程就认定有环的话,会把这种无环的情况也归为有环,因此就算我们递归到了之前递归过的课程也不能断定有环。

代码:

lass Solution {
private:unordered_map<int,vector<int>>m;
public:bool find(int cur,int init,unordered_set<int>&s){if(cur==init) return false;     //如果先修课的先修课中含有最初始的课程,那么闭环.if(s.count(cur)) return true;   //如果递归到了之前递归过的课程,那么结束本次遍历,无法判断是否闭环s.insert(cur);                  //添加递归过的课程避免陷入死循环for(auto i:m[cur]){             //递归本次课程的先修课if(!find(i,init,s)) return false;}return true;}bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {for(auto& p:prerequisites){     //构建有向图if(m.find(p[0])==m.end()) m[p[0]]=vector<int>(0);m[p[0]].push_back(p[1]);}for(int i=0;i<numCourses;i++){ unordered_set<int>s;//寻找课程的先修课中是否包含自身for(auto j:m[i]){if(!find(j,i,s)) return false;}}return true;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 5.15集成Crypto++ 8.8.0(MSVC 2019)笔记

一、背景 笔者已介绍过在Qt 5.15.x中使用MinGW&#xff08;8.10版本&#xff09;编译并集成Crypto 8.8.0。 但是该编译出来的库&#xff08;.a和.dll&#xff09;不适用MSVC&#xff08;2019版本&#xff09;构建环境&#xff0c;需要重新编译&#xff08;.lib或和.dll&#xf…

pytorch(b站小土堆学习笔记P1-P15)

P3. Python学习中的两大法宝函数&#xff08;当然也可以用在PyTorch&#xff09; import torch#查看pytorch有哪些指令 print(dir(torch)) print(dir(torch.cuda)) #查看每条指令怎么用 help(torch.cuda.is_available) P4. PyCharm及Jupyter使用及对比 P5 dataset和dataloade…

MySQL 连接查询和存储过程

一、连接查询 mysql的连接查询&#xff0c;通常都是将来自两个或多个表的记录行结合起来&#xff0c;基于这些表之间的共同字段&#xff0c;进行数据的拼接 首先&#xff0c;要确定一个主表作为结果集&#xff0c;然后将其它表的行有选择性的连接到选定的主表结果上&#xff…

C动态分配

动态分布与静态发布&#xff1a; 静态分配 1、 在程序编译或运行过程中&#xff0c;按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区&#xff0c;一般以数组的形式。 4、 按计划分配。 动态分配 1、在程序运…

企业架构LNMP学习笔记7

PHP介绍&#xff1a; HTML&#xff1a;超文本标记语言 http: 超文本传输协议 端口80 浏览器将html代码解析成web页面。 PHP&#xff1a;超文本预处理器。后端语言开发&#xff0c;页面上需要动态改变修改的&#xff0c;需要连接数据库查询数据&#xff0c;转为html。 主要…

3D印刷电路板在线渲染查看工具

从概念上讲&#xff0c;这是有道理的&#xff0c;因为PCB印制电路板上的走线从一个连接到下一个连接的路线基本上是平面的。 然而&#xff0c;我们生活在一个 3 维世界中&#xff0c;能够以这种方式可视化电路以及相应的组件&#xff0c;对于设计过程很有帮助。本文将介绍KiCad…

MDK-Keil AC6 Compiler屏蔽特定警告

最近在使用STM32CubeMX生成MDK工程是&#xff0c;使用了 AC6 版本的编译器进行编译代码&#xff0c;然后发现了一些警告&#xff0c;但是在 AC5 版本下编译又正常。于是研究了下怎么屏蔽特定的警告&#xff0c;这里记录一下。 1. Keil AC6屏蔽特定警告 遇到的警告如下&#x…

【计算机网络】HTTP(上)

文章目录 1.HTTP概念2. URLurlencode 和 urldecode转义规则 3. HTTP的宏观理解HTTP的请求HTTP的响应 4. 见一见HTTP请求和响应请求报头 1. 模拟一个简单的响应response响应报头 2. 从路径中获取内容ReadFile函数的实现 3.不同资源进行区分反序列化的实现ReadOneLine函数的实现P…

Delphi、C# 和 TypeScript 之父 Anders Hejlsberg(安德斯·海尔斯伯格,海神)赶潮AI

自2022年11月ChatGPT横空出世&#xff0c;一波由AIGC引发的热潮轰轰烈烈持续传播。 全球各国政府及大型互联网企业都在积极布局人工智能解决方案&#xff0c;抢占人工智能高地&#xff0c;推动人工智能产业健康发展。 Delphi、C# 和 TypeScript 之父&#xff0c;位列Microsof…

flink的物理DataFlow图及Slot处理槽任务分配

背景 在flink中&#xff0c;有几个比较重要的概念&#xff0c;逻辑DataFlow图&#xff0c;物理DataFlow图以及处理槽执行任务&#xff0c;本文就来讲解下这几个概念 概念详解 假设有以下代码&#xff1a;数据源和统计单词算子的并行度是2&#xff0c;数据汇算子的并行度是1&…

HotSpot垃圾收集算法实现细节

文章目录 根节点枚举安全点安全区域记忆集与卡表写屏障三色标记 根节点枚举 在可达性分析算法中&#xff0c;由于GC Roots众多&#xff0c;所以在从GC Roots集合中进行引用链查找时会耗费大量时间。 迄今为止&#xff0c;所有收集器在根节点枚举这一步骤时都是必须暂停用户线…

​怎么安全无损地将操作系统转移到固态硬盘?

为什么需要转移系统到固态硬盘&#xff1f; 现如今&#xff0c;许多用户想要将自己的操作系统转移到固态硬盘&#xff0c;这是为什么呢&#xff1f;我们在下面向大家简单地介绍了一下迁移系统的优势&#xff1a; ​提升计算机性能&#xff1a;硬盘&#xff08;HDD…