207. 课程表
207. 课程表
https://leetcode.cn/problems/course-schedule/
难度中等1526
你这个学期必须选修 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 <= 1050 <= prerequisites.length <= 5000prerequisites[i].length == 20 <= ai, bi < numCoursesprerequisites[i]中的所有课程对 互不相同
题解:
请看大佬的题解:力扣 思路和文字表达都非常好
/*** @param {number} numCourses* @param {number[][]} prerequisites* @return {boolean}*/
const numCourses = 4,prerequisites = [[1, 0],[2, 1],[2, 3],[3, 0],];
var canFinish = function (numCourses, prerequisites) {const inDegree = new Array(numCourses).fill(0); //入度数组const map = {};for (let i = 0; i < prerequisites.length; i++) {inDegree[prerequisites[i][0]]++; //计算每一门课的入度(通俗来讲就是,看这一门可有没有先修课,这在二维数组中体现的很直观,只要有[i][0]存在,就是课程号为prerequisites[i][0]的这门课有一个先修课,向inDegree中记录,也就是直接定义到了下标为这个课程号的位置,进行一个自加,通过循环就成功的记录下了这门课有几个先修课)if (map[prerequisites[i][1]]) {//当前课程已经存在于领接表(用哈希表记录依赖关系)map[prerequisites[i][1]].push(prerequisites[i][0]); //添加依赖它的后续课,意为[i][0]这门课的先修课是[i][1]} else {map[prerequisites[i][1]] = [prerequisites[i][0]]; //获取先修课的课程号,赋值到要选这门先修课的课程号(下标)上,这里不需要担心会重复计算,在if中会检测到之前有过记录,然后把后续课push上数组console.log([prerequisites[i][0]]);}}console.log("inDegree:", inDegree);console.log("map:", map);const queue = [];for (let i = 0; i < inDegree.length; i++) {if (inDegree[i] == 0) queue.push(i); //用来存储入度值为0的课,也就是不需要先修课的课程,最基础的课}let count = 0;while (queue.length) {const selected = queue.shift(); //记录当前被选的课程号// shift()方法可以删除数组的第一个元素,返回它,然后将所有剩余的元素向前移动1位,以填充数组头部的空白count++;console.log("当前选课:", selected);const toEnQueue = map[selected]; //在map中通过当前所选课程号来找到它的后续课console.log("这次在map中选中对应的后续课:", map[selected]);if (toEnQueue && toEnQueue.length) {//这门课确实存在console.log("111");for (let i = 0; i < toEnQueue.length; i++) {console.log("222");inDegree[toEnQueue[i]]--; //在inDegree中找到课程号是toEnQueue[i]的元素,自减,依赖它的后续课的入度-1if (inDegree[toEnQueue[i]] == 0) {queue.push(toEnQueue[i]); //将入度变成0的课程再次加入队列中,入度为0后就不会进入if判断语句,在接下来的while中就会被删除console.log("push queue:", queue);}}}console.log("queue:", queue);}//如果count的值与所需上的可课程数不同就代表,还有数据的入度不为0console.log(count == numCourses ? "true" : "false");return count == numCourses;
};
canFinish(numCourses, prerequisites);
相关文章:
207. 课程表
207. 课程表https://leetcode.cn/problems/course-schedule/ 难度中等1526 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [a…...
2023-03-08 mysql列存储数据库-查询执行过程分析
摘要: 在mysql的sql层和存储引擎的交互模式中, 存储引擎实现handler接口, 由SQL层负责调用接口, 所以执行的过程可以看作是在sql层中, innodb仅提供接口。 但是在mysql列存储引擎中, TMD直接替换掉了sql层的执行接口,并且将sql层的查询树转换成了自己的一套查询树, 然后根据…...
各种激活函数的计算公式、图像以及实现代码
激活函数已经成为神经网络中非常重要的一部分,随着各种类型的神经网络模型被人们开发出来,各种激活函数也应运而生,在不同的场景中,取得良好的效果。本文跟据著名的YOLO系列目标检测模型的源码 AlexeyAB Darknet,整理出…...
ArangoDB
介绍 ArangoDB 是一个原生的多模型开源数据库,具有灵活的文档、图形和键值数据模型。使用方便的类似 SQL 的查询语言或 JavaScript 扩展构建高性能应用程序。主要特点 在集群上安装 ArangoDB —— 安装简单灵活的数据建模:数据建模为键值对、文档或图表的…...
MySQL8.0Linux安装及主从的搭建
MySQL8.0Linux安装教程 下载并安装 需要说明的一点是我使用的是SSH secure shell Client连接linux系统的,它的用法和命令窗口差不多。界面如图:一样的使用Linux命令操作。 话不多说 第一步: 1)、切换到 /usr/local下 cd /usr/…...
苹果新专利实现无线技术传输睡眠数据,蓝牙在智能家居中的应用
苹果于 2017 年 5 月收购了芬兰科技公司 Beddit,只是在过去 6 年时间里并没有太大的动作。根据美国商标和专利局本周公示的清单,苹果获得了一项 Beddit 相关的技术专利。 根据专利描述,苹果使用一根或者多根天线,利用电磁辐射的…...
银行数字化转型导师坚鹏:数字化转型为什么需要致良知与知行合一
在银行数字化转型过程中,特别需要致良知与知行合一哲学思想的指导。 知中有行,行中有知;行极而知,知极而行;知行无端,知行无始。知与行是一件事,做事与培养本体(修心)也是…...
Web前端学习:章三 -- JavaScript预热(二)
六五:作用域与function function:函数,不是数学上的函数,与写代码有关 JS中的函数:运用它,起个名字,然后对函数进行调用,即可将函数中的内容执行一遍 1、function 最基本的作用域…...
Excel绘制数据对比表格-表格可视化
Word中生成的表格一般比较单调,若一组数据存在对比的情况时,读者/审稿人难以直接通过详细对比数据来分析,此时若可以将该组数据可视化来对比则为好,Excel则可实现该功能。 关于有些期刊需要提供表格中的数据便于复制等情况时&…...
究竟是谁负了谁,来自底层测试的2022年终总结
前言 说实话坐在椅子前,都想好了,该怎么去写,甚至感觉有好多要写的,但是当我坐在椅子上时,却不知道该怎么开头了,不知道是不是紧张?还是不舍?难道还没有跟过去挥手告别的勇气吗&…...
C++——IO流
目录 C语言的输入与输出 流是什么 CIO流 C标准IO流 C文件IO流 二进制读写 文本读写 stringstream的简单介绍 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键 盘)读取数据,并将值存放在变量中。…...
网络 | UDP与TCP协议讲解 | TCP可靠性是怎样实现的?
文章目录前置知识查看网络状态的工具查看进程idUDP协议协议格式UDP只有接收缓冲区基于UDP的应用层协议TCP协议流的理解协议格式确认应答机制缓冲区序号的作用流量控制超时重传机制6位标志位紧急数据的处理三次握手listen的第二个参数全连接和半连接队列都维护了什么信息&#x…...
JavaEE——简单介绍Thread类以及线程的基本操作
文章目录一、Thread 类中的常见构造方法二、Thread 的一些常见属性三、线程的启动——start()isAlive() 方法的解释四、线程中断五、线程等待-join()了解六、简单解释线程休眠一、Thread 类中的常见构造方法 我们已知,Thread 类是Java中多线程中的一个关键类&#…...
Java的数据库编程:JDBC
Content 🎉1什么是API 🎉2.什么是JDBC 🎉3.数据库驱动包的安装 🎉4.数据库安装包在idea的使用 🎉5.JDBC的增删改查的简单实现 今天为大家带来JAVA的数据库编程,也就是用Java实现数据库 数据库的最基本的操作就是…...
蓝桥冲刺31天之第六天
今天是摆子的一天,明天我要肝一整天的第四题!!! PS:一个普通的排序罢了 import java.io.*; import java.util.Arrays; import java.util.Scanner;/*** ClassName 考勤刷卡* Description TODO* Author 小怂很怂* Date 2…...
Streamlit 工具记录
Streamlit 是基于 Python 的 Web 应用程序框架,可视化数据,分析结果。 Streamlit 是一个开源库,可在短时间内开发机器学习可视化仪表板。只需几行代码就可以构部署强大的数据应用程序。Streamlit 可将仪表板的开发时间从几天缩短至几小时。 …...
GreenPlum小结
什么是GreenPlum?GreenPlum是业界最快最高性价比的关系型分布式数据库,它在开源的PostgreSQL的基础上采用MPP架构(Massive Parallel Processing,海量并行处理),具有强大的大规模数据分析任务处理能力。GreenPlum作为大数据融合存储…...
C语言中数组和指针
文章目录前言一、指针的概念二、指针的大小三、指针的用法1.指针指向变量2.指针指向数组3.指针指向函数总结前言 本文将给大家带来C语言中非常重要的两个知识点,指针和数组。 一、指针的概念 指针,是C语言中的一个重要概念及其特点,也是掌…...
Leetcode.剑指 Offer II 022 链表中环的入口节点
题目链接 Leetcode.剑指 Offer II 022 链表中环的入口节点 mid 题目描述 给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。 为了表示给定链表中的环&#…...
4种不同编程语言的打印方式
意义 打印方式是编程中不可或缺的一部分,它可以帮助开发人员有效地调试和测试代码,并提供有用的信息来监视程序的运行状态和性能。 编程语言中的打印方式是指将程序输出到终端或控制台上进行显示。这个功能在编程中非常重要,因为它可以帮助开…...
Qwen3-14B镜像轻量化设计:50GB系统盘+40GB数据盘高效空间管理
Qwen3-14B镜像轻量化设计:50GB系统盘40GB数据盘高效空间管理 1. 镜像概述与核心优势 Qwen3-14B私有部署镜像是一款专为RTX 4090D 24GB显存显卡优化的轻量化解决方案。通过精心设计的50GB系统盘40GB数据盘架构,实现了大模型部署的空间效率最大化。这个镜…...
Graphviz节点位置控制实战:如何用invis边解决自动排版抽风问题
Graphviz节点位置控制实战:如何用invis边解决自动排版抽风问题 当你用Graphviz自动生成关系图时,是否遇到过节点位置完全不符合预期的情况?比如明明希望节点3出现在节点2的左侧,但生成的图像却总是反着来。这种"抽风"现…...
零基础实战:揭秘Python漫画下载器高效收藏完整指南
零基础实战:揭秘Python漫画下载器高效收藏完整指南 【免费下载链接】copymanga-downloader 使用python编译exe/bash/命令行参数来下载copymanga(拷贝漫画)中的漫画,支持批量选话下载和获取您收藏的漫画并下载!(windows&linux支持…...
**实时内核中的任务调度机制:从理论到C++实现的深度探索**在嵌入式系统和高实时性应用中,**实时内核(Real-
实时内核中的任务调度机制:从理论到C实现的深度探索 在嵌入式系统和高实时性应用中,实时内核(Real-Time Kernel) 是整个系统稳定运行的核心。它不仅负责资源分配,还承担着任务调度、中断响应、同步机制等关键职责。本文…...
三极管实战指南:从NPN到PNP,手把手教你识别与使用(附常见误区解析)
三极管实战指南:从NPN到PNP,手把手教你识别与使用(附常见误区解析) 在电子设计的世界里,三极管就像电路中的"水龙头",控制着电流的流动。无论是简单的LED驱动电路,还是复杂的音频放大…...
AUTOSAR SPI配置进阶:如何为你的车载传感器设计高效可靠的通信序列?
AUTOSAR SPI配置进阶:车载传感器通信序列设计实战指南 在智能驾驶系统开发中,SPI总线作为连接毫米波雷达、IMU等关键传感器的神经末梢,其通信效率直接影响着环境感知的实时性。传统配置手册往往止步于基础参数说明,而本文将带您深…...
QGIS进阶指南:动态标注与条件表达式高级应用
1. 动态标注的核心价值与应用场景 当你面对一个包含上千条建筑数据的地图图层时,传统静态标注会显得力不从心——商场和医院用相同字体显示,重要地标淹没在普通建筑中,数据更新后还得手动调整样式。这就是动态标注技术大显身手的时候了。 动态…...
STM32+FreeRTOS双分区开发避坑指南:Bootloader跳转前别忘了这行关键代码
STM32FreeRTOS双分区开发避坑指南:Bootloader跳转前别忘了这行关键代码 当你在STM32上实现BootloaderApp双分区架构时,是否遇到过这样的场景:Bootloader明明成功跳转到了应用程序,却在启动FreeRTOS调度器时突然崩溃?寄…...
数值分析实战指南:北航研究生大作业解析与代码实现
1. 数值分析大作业的核心价值 第一次接触北航研究生数值分析大作业时,我和大多数同学一样感到无从下手。直到在实验室熬了三个通宵后,我才真正明白这份作业的独特价值——它完美架起了理论与实践的桥梁。这份大作业最精妙之处在于,它不仅仅是…...
【T6/T3】通过账套备份文件快速识别畅捷通软件版本的实用技巧
1. 为什么需要识别畅捷通软件版本 最近接手了一个老客户的财务系统迁移项目,发现他们提供的账套备份文件没有标注具体版本号。这种情况在实际工作中很常见——企业可能多年未升级系统,或者交接文档不完整。如果直接安装错误版本的畅捷通软件,…...
