leetcode—课程表 拓扑排序

1 题目描述

你这个学期必须选修 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 。这是不可能的

2 拓扑排序

有向无环图:一定有一个点的入度为0,如果找不到入度为0的点,这个图一定是带环的

入度:入度就是指向该结点的边数

出度:出度就是该结点指向其他结点的边数

拓扑排序思路:一个有向无环图,如果图中存在入度为0 的节点,就把这个点删掉,同时也删掉这个点所连的边;重复上述步骤,如果所有点都能被删掉,则这个图可以进行拓扑排序

3 方法

将本题建模成一个求拓扑排序的问题了:

  1. 我们将每一门课看成一个节点;
  2. 如果想要学习课程 AAA 之前必须完成课程 BBB,那么我们从 BBB 到 AAA 连接一条有向边。这样以来,在拓扑排序中,BBB 一定出现在 AAA 的前面。

算法

对于图中的任意一个节点,它在搜索的过程中有三种状态,即:

  • 「未搜索」:我们还没有搜索到这个节点;
  • 「搜索中」:我们搜索过这个节点,但还没有回溯到该节点,即该节点还没有入栈,还有相邻的节点没有搜索完成);
  • 「已完成」:我们搜索过并且回溯过这个节点,即该节点已经入栈,并且所有该节点的相邻节点都出现在栈的更底部的位置,满足拓扑排序的要求。

通过上述的三种状态,我们就可以给出使用深度优先搜索得到拓扑排序的算法流程,在每一轮的搜索搜索开始时,我们任取一个「未搜索」的节点开始进行深度优先搜索。

4 代码

package matrix;import java.util.ArrayList;
import java.util.List;public class TuoPu {public static void main(String[] args) {int numCourses = 2;int[][] prerequisites = {{1,0}};System.out.println(canFinish(numCourses, prerequisites));}// 课程表// 存储每个课程的邻接节点列表static List<List<Integer>> edges;// 存储每个课程是否被访问过static int[] visited;// 表示当前拓扑排序是否合法static boolean vaild = true;public static boolean canFinish(int numCourses, int[][] prerequisites) {// 初始化邻接表和访问状态edges = new ArrayList<List<Integer>>();for(int i = 0; i < numCourses; i++){edges.add(new ArrayList<Integer>());}visited = new int[numCourses];for(int[] info : prerequisites){edges.get(info[1]).add(info[0]);}// 进行拓扑排序for(int i = 0; i < numCourses && vaild; i++){if(visited[i] == 0){dfsHelp(i);  // 调用深度优先搜索进行拓扑排序}}return vaild;}// 深度优先搜索 用于拓扑排序public static void dfsHelp(int u){// 标记当前节点为已访问visited[u] = 1;// 遍历当前节点的所有邻接节点for(int v : edges.get(u)){// 如果邻接节点未被访问递归if(visited[v] == 0){dfsHelp(v);// 若存在环 则终止搜索if(! vaild){return;}}else if(visited[v] == 1){// 若邻接节点正在被访问 说明存在环 终止访问vaild = false;return;}}// 标记当前节点已经被完全访问visited[u] = 2;}}

参考:

作者:力扣官方题解
链接:https://leetcode.cn/problems/course-schedule/solutions/359392/ke-cheng-biao-by-

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

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

相关文章

《WebKit 技术内幕》学习之五(2): HTML解释器和DOM 模型

2.HTML 解释器 2.1 解释过程 HTML 解释器的工作就是将网络或者本地磁盘获取的 HTML 网页和资源从字节流解释成 DOM 树结构。 这一过程中&#xff0c;WebKit 内部对网页内容在各个阶段的结构表示。 WebKit 中这一过程如下&#xff1a;首先是字节流&#xff0c;经过解码之…

ORBSLAM3安装

0. C11 or C0x Compiler sudo apt-get install gccsudo apt-get install gsudo apt-get install build-essentialsudo apt-get install cmake1. 依赖 在该目录终端。 1. 1.Pangolin git clone https://github.com/stevenlovegrove/Pangolin.git sudo apt install libglew-d…

Python基础第九篇(Python可视化的开发)

文章目录 一、json数据格式&#xff08;1&#xff09;.转换案例代码&#xff08;2&#xff09;.读出结果 二、pyecharts模块介绍三、pyecharts模块入门&#xff08;1&#xff09;.pyecharts模块安装&#xff08;2&#xff09;.pyecharts模块操作&#xff08;1&#xff09;.代码…

C++力扣题目509--斐波那契数 70--爬楼梯 746--最小花费爬楼梯

509. 斐波那契数 力扣题目链接(opens new window) 斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n -…

了解WPF控件:PrintDialog常用属性与用法(八)

掌握WPF控件&#xff1a;熟练常用属性&#xff08;八&#xff09; PrintDialog -一个对话框&#xff0c;用于在打印文档时显示打印设置参数供用户选择并确认。通过该控件&#xff0c;用户可以选择打印机、打印的范围、打印的份数、打印质量等。 常用属性描述CurrentPageEnab…

制作编写使用说明书:在结构、风格与内容方面需要注意什么?

如今&#xff0c;一个清晰、简洁、易于理解的使用说明书不仅能够帮助用户正确地使用产品&#xff0c;还能提升用户体验并树立品牌形象。而制作编写一份优质的使用说明书需要我们在结构、风格与内容三个方面下功夫。那么在制作编写使用说明书时需要注意哪些关键要素呢&#xff1…

【JavaWeb】日程管理系统 项目搭建 第二期

文章目录 一、数据库准备二、导入依赖 与 JDBC工具类三、pojo包处理四、daodao包工具类 五、service六、controllerservlet 基类 反射 七、加密工具类 MD5八、页面文件九、业务代码9.1 注册业务处理9.2 登录业务处理 总结 一、数据库准备 创建数据库&#xff1a; SET NAMES …

vue折叠展开transition动画使用keyframes实现

需求&#xff0c;我正常的菜单功能有隐藏与显示功能&#xff0c;需要增加动画 打开的时候宽度从0到300&#xff0c;关闭的时候&#xff0c;宽度从300到0 <template> <div id"app"> <button click"toggleLength">Toggle Length</bu…

骨传导耳机综评:透视南卡、韶音和墨觉三大品牌的性能与特点

在当前的蓝牙音频设备领域中&#xff0c;骨传导蓝牙运动耳机以其出色的安全特性和舒适的体验&#xff0c;受到了健身爱好者们的广泛好评。这类耳机不同于我们常见的入耳式耳机&#xff0c;它的工作方式是直接通过振动将声音传递到用户的耳骨中&#xff0c;这样既可以享受音乐&a…

【nowcoder】链表的回文结构

牛客题目链接 链表的回文结构 /* struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {} };*/ #include <cstdlib> // 建议大伙自己对照我的代码画下图&#xff0c;假设A链表是&#xff1a;1 2 3 2 1 class PalindromeList { publi…

【学网攻】 第(7)节 -- 生成树配置

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan【学网攻】 第(5)节 -- Cisco VTP的使用【学网攻】 第(6)节 -- 三层交换机实现VLAN间路由 前言 网络已经成为…

vscode 如何指定启动文件?

launch.json 里面可以指定&#xff0c;launch.json 在打开文件夹的时候可以创建&#xff0c;或者手动创建

不合格机器人工程讲师再读《悉达多》-2024-

一次又一次失败的经历&#xff0c;让我对经典书籍的认同感越来越多&#xff0c;越来越觉得原来的自己是多么多么的无知和愚昧。 ----zhangrelay 唯物也好&#xff0c;唯心也罢&#xff0c;我们都要先热爱这个世界&#xff0c;然后才能在其中找到自己所热爱的事业。 ----zh…

【OpenCV】P2 程序加载显示图片

目录 四个步骤读取图像创建窗口显示图像释放内存 完整代码 在 Opencv 中&#xff0c;如果想要加载展示一张图片&#xff0c;有以下几个步骤&#xff1a; 读取图像&#xff1a;根据指定路径读取图像&#xff0c;将图像转化为数字矩阵形式&#xff1b;创建窗口&#xff1a;创建图…

vue2项目打包到测试环境之后报错require is not defined

配置打包命令npm run build:test到测试环境之后报错&#xff0c;打包到生产环境没有问题&#xff0c;查找了项目中的require引入似乎也没啥有问题的地方&#xff0c;所以排除是require的原因 环境变量文件&#xff1a; 打包指令&#xff1a; 解决办法&#xff1a; 将.env.tes…

【vue开发示例介绍】

vue开发示例介绍 1. 开发示例1.1 做一个自定义组件Welcome1.2 增加“用户管理”和“关于我们”组件1.3 嵌套路由 1. 开发示例 1.1 做一个自定义组件Welcome 1&#xff09; 在components下创建一个Welcome.vue自定义组件 <template><div class"hello">…

九、C++结构体(1)

一、结构体概念 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型 二、结构体定义和使用 语法&#xff1a; struct 结构体名 {结构体成员列表}; 通过结构体创建变量的方式有三种&#xff1a; 1、struct 结构体名 变量名 2、struct 结构体名 变量名…

[docker] Docker 网络和Cgroup

一、Docker 网络 1.1 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认…

go语言模板处理包text/template详解

本文对go语言内置模板处理包"text/template"常用操作汇总进行了详解&#xff0c;非常全面&#xff0c;一次搞定你的问题&#xff01;还不收藏等啥呢&#xff01; 目录 通用结构体定义 通用转换 1&#xff0c;基础操作 2&#xff0c;解析文件 3&#xff0c;自定义…

【C/C++】C/C++编程——C++ 开发环境搭建

C的开发环境种类繁多&#xff0c;以下是一些常见的C 集成开发环境&#xff1a; AppCode &#xff1a;构建与JetBrains’ IntelliJ IDEA 平台上的用于Objective-C&#xff0c;C,C&#xff0c;Java和Java开发的集成开发环境CLion&#xff1a;来自JetBrains的跨平台的C/C的集成开…