课程表 - LeetCode 热题 53

大家好!我是曾续缘💘

今天是《LeetCode 热题 100》系列

发车第 53 天

图论第 3 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

课程表

你这个学期必须选修 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 <= 2000
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • prerequisites[i] 中的所有课程对 互不相同
难度:💖💖

解题方法

这道题目是典型的拓扑排序问题。我们需要判断是否可以完成所有课程的学习。

在拓扑排序中,首先考虑的是没有任何入边的节点,也就是没有先修课程要求的节点。将这样的节点加入拓扑排序的结果列表后,可以移除该节点的所有出边,减少相邻节点对先修课程的需求。如果某个相邻节点变成了没有任何入边的节点,那么说明这门课可以开始学习了,加入拓扑排序的结果列表。按照这个流程,持续将没有入边的节点加入拓扑排序的结果列表,直到包含所有节点(得到一种拓扑排序),如果不包含所有节点,说明图中存在环,换上的节点不能因为入边为0加入结果列表中。

具体过程如下:

  1. 首先,我们需要建立一个有向图来表示先修课程的关系。使用邻接表的形式存储图,即使用一个二维列表edges,其中edges[i]存储了课程i的后续课程。
  2. 同时,我们需要统计每门课程的入度(即有多少先修课程)。使用一个一维数组deg来记录每门课程的入度。
  3. 接下来,我们需要找到没有任何入边的节点,因为这些课程可以直接学习,没有先修课程的要求。我们将这些节点加入到拓扑排序的结果中,并将与其相邻的节点的入度减少1。
  4. 重复步骤3,直到队列为空。最后,如果拓扑排序的结果包含了所有课程,说明可以完成全部课程的学习;否则,存在环,不可能完成所有课程的学习。

Code

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<List<Integer>> edges = new ArrayList<List<Integer>>();for(int i = 0; i < numCourses; i++){edges.add(new ArrayList<Integer>());}int[] deg = new int[numCourses];for(int[] e : prerequisites){edges.get(e[1]).add(e[0]);deg[e[0]]++;}Queue<Integer> q = new LinkedList<Integer>();for(int i = 0; i < numCourses; i++){if(deg[i] == 0){q.offer(i);}}List<Integer> topo = new ArrayList<Integer>();while(!q.isEmpty()){int u = q.poll();topo.add(u);for(int v : edges.get(u)){deg[v]--;if(deg[v] == 0){q.offer(v);}}}return topo.size() == numCourses;}
}

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

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

相关文章

oneapi:强大而易用的OpenAI接口管理和分发系统 大模型 通用接口 ollama

使用One-api代理我所有的各类接口渠道,包括gpt-3.5-trubo、gpt-4等openAI官方模型,azure提供的模型,集成联网知识库等功能的gpt4模型,以及国内模型的一些模型。同时支持openai图像生成接口。 1. 准备工作 创建应用目录,例如在/share/Container下创建文件夹oneapi在oneapi…

情绪自留地:是自我世界,不被他人左右

情绪&#xff0c;是我们内心世界的反映&#xff0c;它既能够体现我们对外界事物的态度&#xff0c;也是我们自我认知的重要部分。在现代社会&#xff0c;人们越来越重视情绪管理&#xff0c;因为良好的情绪状态对于个人的心理健康和社交关系都有着不可忽视的影响。本文将探讨如…

代码随想录算法训练营DAY40\DAY41|C++动态规划Part.3|343.整数拆分、96.不同的二叉搜索树

DAY40休息日&#xff0c;本篇为DAY41的内容 文章目录 343.整数拆分思路dp含义递推公式&#xff08;难点&#xff09;初始化遍历顺序打印 CPP代码数学方法归纳证明法 96.不同的二叉搜索树思路dp含义递推公式初始化遍历顺序打印 CPP代码题目总结 343.整数拆分 力扣题目链接 文章…

Windows系统下安装Mosquitto的步骤(7)

接前一篇文章&#xff1a;Windows系统下安装Mosquitto的步骤&#xff08;6&#xff09; 本文内容参考&#xff1a; Windows下搭建MQTT服务器_mqtt服务器软件-CSDN博客 Enable SSL/TLS Connection | EMQX Enterprise Docs 特此致谢&#xff01; 上一回讲解了使用MQTTX图形界面…

C/C++开发,opencv-ml库学习,K近邻(KNN)应用

目录 一、k近邻算法 1.1 算法简介 1.2 opencv-k近邻算法 二、cv::ml::KNearest应用 2.1 数据集样本准备 2.2 KNearest应用 2.3 程序编译 2.4 main.cpp全代码 一、k近邻算法 1.1 算法简介 K近邻算法&#xff08;K-Nearest Neighbor&#xff0c;KNN&#xff09;基本原理是…

uniapp 微信开发工具上访问正常,真机调试一直跨域报错

微信小程序真机调试时&#xff0c;出现跨域问题&#xff0c;需要同时在后端设置多种允许跨域的设置&#xff1a; // 指定允许其他域名访问 header(Access-Control-Allow-Origin:*); // 响应类型 header(Access-Control-Allow-Methods:GET,POST,OPTION); // 响应头设置 header(…

【实验】根据docker部署nginx并且实现https

环境准备 systemctl stop firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装最新版…

python的基本语法

Python的基本语法包括变量、数据类型、运算符、控制流、函数、类和模块等&#xff0c;它们可以帮助用户快速编写高效程序。本文逐个详解。 简介 Python是一种非常受欢迎的计算机编程语言&#xff0c;它拥有强大的功能&#xff0c;可以用于开发各种软件&#xff0c;包括移动应…

Unity 编辑器工具 - 资源引用查找器

在Unity项目开发过程中&#xff0c;管理和维护资源之间的引用关系是至关重要的。当然我们项目也是需要这个功能 毕竟项目大了之后查找资源引用还是交给 资源引用查找器 比较好。 功能概述 资源引用查找器允许开发者选择一个目标资源&#xff0c;并在整个项目中查找引用了该资…

记录vue报错问题 in ./node_modules/axios/lib/platform/index.js

今天这个问题困扰了我许久 报错内容如下&#xff1a; 最初一直以为是我没装axios&#xff0c;又重新装了一次&#xff0c;后面才发现是axios版本原因&#xff0c;真的总是被版本的原因困住真的很烦 解决方法如下&#xff1a; 将axios的版本改为1.5.0 1、打开项目的文件夹“…

SharedPreferences源码解析

前言 文章中部分地方SharedPreferences会简写成SP&#xff0c;先抛出几个问题&#xff1a; SP存储的是什么文件&#xff0c;存储在哪个位置&#xff1f;SP是线程安全的吗&#xff1f;SP是如何保证数据安全的&#xff1f;使用SP有哪些问题&#xff1f;SP会把数据加载到内存中吗…

wireshark的安装使用及相关UDP、TCP、 ARP

初步了解&#xff1a; 进入wireshark后如图&#xff1a; 从图中可以看到很多网络连接在操作的时候我们需要监测哪些 我们可以直接在本地的运行框中输入ipconfig来查看 如图&#xff1a; 从以上图片中我们可以清楚地看到哪些网络连接已经连接的我们只需要按需监测他们即可 但…

JSP与JavaBean

目录 一、JavaBean是什么 二、创建JavaBean 三、在JSP中使用JavaBean 1、按照Java语法直接使用 2、<jsp:useBean>动作 Bean的加载原理 scope属性的不同取值 3、<jsp:setProperty>动作 设置为一个表达式的值或字符序列 通过表单的参数的值来设置Bean的相应…

Java中有ConcurrentHashMap,解释它如何帮助管理并发性

ConcurrentHashMap 是 Java 并发包 java.util.concurrent 中的一个线程安全的哈希表实现。它被设计用来提供高效率的并发访问并且在多线程环境下可以显著提升性能。与传统的 HashMap 不同&#xff0c;ConcurrentHashMap 对整个数据结构进行了细粒度的锁控制。这些主要特性有助于…

【C++】STL — List的接口讲解 +详细模拟实现

前言&#xff1a; 本章我们将学习STL中另一个重要的类模板list… list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是带头双向循环链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xf…

vue3+vite+js axios引用

先交代下基础版本&#xff1a; “node”&#xff1a;“V16.14.1” “vue”: “^3.4.21” “vite”: “^5.2.0” 安装&#xff1a;npm install axios --save在src目录下的utils文件夹创建一个request.js文件&#xff08;示例代码&#xff0c;仅供参考&#xff09;: //引入axio…

论文笔记ColdDTA:利用数据增强和基于注意力的特征融合进行药物靶标结合亲和力预测

ColdDTA发表在Computers in Biology and Medicine 的一篇一区文章 突出 • 数据增强和基于注意力的特征融合用于药物靶点结合亲和力预测。 • 与其他方法相比&#xff0c;它在 Davis、KIBA 和 BindingDB 数据集上显示出竞争性能。 • 可视化模型权重可以获得可解释的见解。 …

三种滤波(EKF、UKF、CKF)的对比,含MATLAB源代码

使用MATLAB模拟三维的滤波,包含扩展卡尔曼滤波EKF、无迹卡尔曼滤波UKF、容积卡尔曼滤波CKF。 状态更新和观测更新均为非线性的,模拟一定强度的机动性,可用于卡尔曼滤波方法的对比学习,自己修改成需要的运动模型后,可以用于组合导航(GPS+DVL形式)。 运行结果 真值的三轴…

Unity UGUI Image 点击事件忽略空白像素区域

我们会遇到图片不是方形的不规则图片。这个时候我们希望只有点击到图像内容本身才算点击&#xff0c;点击空白区域则不算点击。而UGUI对图片的处理是整个图片都会算作点击区域&#xff0c;这样不能满足于我们的使用需求了。 首先我们需要把图片本身的Read/Write 选项打开 然后…

HCIP第三节

一.OSPF接口类型&#xff08;ospf在不同网络类型接口上的不同工作方式&#xff09; 查看ospf协议在接口具体的工作方式名称&#xff1a; display ospf interface g0/0/1 1.LoopBack接口类型 : OSPF的工作方式&#xff1a;华为显示p2p&#xff0c;实为环回专用工作方式 &…