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

news2024/10/6 18:31:18

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

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

这道题和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.coloradmin.cn/o/991946.html

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

相关文章

中科驭数携DPU系列创新产品亮相2023服贸会

9月2日至6日&#xff0c;由商务部、北京市政府主办的2023年中国国际服务贸易交易会&#xff08;简称“服贸会”&#xff09;在北京举行。在电信、计算机和信息服务专题展馆&#xff0c;中科驭数等一批国家专精特新“小巨人”携最新数据处理器DPU亮相&#xff0c;展示了多项创新…

PaddleOCR学习笔记3-通用识别服务

今天优化了下之前的初步识别服务的python代码和html代码。 采用flask paddleocr bootstrap快速搭建OCR识别服务。 代码结构如下&#xff1a; 模板页面代码文件如下&#xff1a; upload.html : <!DOCTYPE html> <html> <meta charset"utf-8"> …

Linux命令200例:free用来显示系统内存使用情况

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

通达信自定义副图换手率指标 HSL_QD

LB:VOL/((REF(VOL,1)REF(VOL,2)REF(VOL,3)REF(VOL,4)REF(VOL,5))/5); DRAWBAND(25,RGB(0,0,0),IF((20MA(LB,5)*5)<40,20MA(LB,5)*5,40),RGB(205,205,0));{量比均线}{DRAWBAND(0,RGB(66,66,66),10,RGB(66,66,66))}; {DRAWBAND(10,RGB(66,66,66),MA(IF((100*VOL/CAPITAL3)<…

【数据结构--二叉树】平衡二叉树

题目描述&#xff1a; 代码实现&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int TreeHeight(struct TreeNode* root) {if(rootNULL)return 0;//左右子树中大的…

12分钟从Executor自顶向下彻底搞懂线程池

通读本篇文章前先来看看几个问题&#xff0c;看看你是否已经理解线程池 什么是池化技术&#xff1f;它有什么特点&#xff0c;哪些场景使用&#xff1f;Executor是什么&#xff1f;它的设计思想是什么样的&#xff1f;工作任务有几种&#xff1f;有什么特点&#xff1f;如何适…

小节1:Python字符串打印

1、字符串拼接 用可以将两个字符串拼接成一个字符串 print("你好 " "这是一串代码") 输出&#xff1a; 2、单双引号转义 当打印的字符串中带有引号或双引号时&#xff0c;使用\或\"表示 print("He said \"Let\s go!\"") 输…

OpenRoads两期工程量(挖填)方量计算

分别生成各期地形&#xff0c;由Create Terrain Model From Ascii File展点&#xff1b; 其中至少一期地形特征设为Existing组特征 创建挖填体积&#xff08;Terrain\Analysis\Create Cut Fill Volumes或Home\Model Analysis and Reporting\Civil Analysis\Create Cut Fill Vo…

深度学习相关VO梳理

相关论文 基于学习的VO 相关&#xff1a; DeepVO Towards End-to-End Visual Odometry with Deep Recurrent Convolutional Neural Networks&#xff08;ICRA&#xff0c;2017&#xff09; TartanVO: A Generalizable Learning-based VO(CoRL2021) SimVODIS: Simultaneous Vis…

第22章 自旋锁死锁实验(iTOP-RK3568开发板驱动开发指南 )

在上一小节中&#xff0c;学习了内核中自旋锁的使用&#xff0c;而自旋锁若是使用不当就会产生死锁&#xff0c;在本章将会对自旋锁的特殊情况-死锁进行讲解。 22.1 自旋锁死锁 死锁是指两个或多个事物在同一资源上相互占用&#xff0c;并请求锁定对方的资源&#xff0c;从而…

【Docker】容器化应用程序的配置管理策略与实践

一、引言 1.1 Docker的背景和优势 Docker是一种开源的容器化平台&#xff0c;简化应用程序的打包、交付和运行过程。基于Linux容器技术&#xff0c;通过提供一个轻量级、可移植和自包含的容器来实现应用程序的隔离和部署。 在传统的应用程序开发和部署中&#xff0c;往往需要…

九科-模块化-创建目录_如果不存在

python代码 # 创建目录_如果不存在 def create_directory_if_not_exists(dir_path):# 如果目录不存在if not os.path.exists(dir_path):# 创建目录os.makedirs(dir_path) 九科组件模块 总图 查询目录是否存在 IF判断目录是否存在 如果目录不存在&#xff0c;创建目录

syn洪流原理

TCP三次握手 建立连接发送或回应第一次握手客户端发送报文&#xff0c;标志位为SYN&#xff08;seqa&#xff09;第二次握手服务器发送报文&#xff0c;标志位为SYN&#xff0c;ACK&#xff08;seqb,acka1&#xff09;第三次握手客户端回应服务器报文&#xff0c;标志位为ACK&…

Java 设置免登录请求接口被拦截问题

1、在设置免登录时&#xff0c;前端将请求的路由添加到白名单后&#xff0c;请求接口还是被拦截到了&#xff0c;将请求接口也设置后还是会被拦截跳转到登录页面 通过JAVA 注解 Anonymous 进行设置匿名访问就可以了

Docker 的常用命令

0 基本命令 概述 [root192 home]# docker --helpUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersOptions:--config string Location of client configfiles (default "/root/.docker")-c, --context string Name of the context…

js中如何判断一个对象是否为空对象?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Object.keys()⭐ 使用 for...in 循环⭐ 使用 JSON.stringify()⭐ 使用 ES6 的 Object.getOwnPropertyNames()⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带…

windows本地认证

来自帅气学弟得经验 阅读流程 windows系统认证包括**本地交互式认证 **和 网络认证 交互式登录&#xff1a;向本地计算机或域账户确认用户的身份 网络登录&#xff1a;对用户尝试访问的网络服务或资源提供用户认证 若是本地用户本地认证需要了解**windows密码 **&#xff0c;…

【C++心愿便利店】No.5---构造函数和析构函数

文章目录 前言一、类的6个默认成员函数二、构造函数三、析构函数 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到我的乱七八糟小星球&#x1f31d; &#x1f4cb;专栏&#xff1a;C 心愿便利店 &#x1f511;本章内容&#xff1a;类…

通过curl命令分析http接口请求各阶段的耗时等

目录 一、介绍二、功能1、-v 输出请求 响应头状态码 响应文本等信息2、-x 测试代理ip是否能在该网站使用3、-w 额外输出查看接口请求响应的消耗时间4、-o 将响应结果存储到文件里面5、-X post请求测试 (没测成功用的不多) 一、介绍 Curl是一个用于发送和接收请求的命令行工具和…

TCP/IP传输协议学习

了解完整的通信过程 1.发送方源终端设备的应用创建数据。 2.当数据在源终端设备中沿协议栈向下传递&#xff0c;对其分段和封装。 3.在协议栈网络接入层的介质上生成数据。 4.通过由介质和任意中间设备组成的网际层网络传输数据。 5.在目的终端设备中沿协议栈向上传递时对其…