210. 课程表 II(拓扑排序)

根据课程之间的关系构造一个有向图,题目要求求解是否能按照顺序学完所有课程,即判断这个有向图是否是有向无环图,如果是求出这个图的拓扑排序,如果不是返回[0]

求这个图的拓扑排序可以按照以下思路:

对于每个节点都有三种状态:

  1. 未搜索
  2. 搜索中:正在搜索这个节点的相邻节点还没回溯回来
  3. 已完成:相邻节点都搜索结束并已经入栈,该节点搜索完成,入栈

对于搜索中的节点u,遍历其相邻节点v,存在以下情况:

  • v未搜索:开始搜索v
  • v搜索中:和u矛盾了,存在环,无拓扑排序
  • v已完成:v已入栈,回溯u

直到所有节点入栈(已完成),从栈顶到栈底的排列即为拓扑排序结果。

这道题中使用int[]index来模拟一个栈。

class Solution {List<List<Integer>> edges;int[] visited;int[] result;boolean hasCircle = false;int index; // 用数组实现栈,用一个index定位public int[] findOrder(int numCourses, int[][] prerequisites) {edges = new ArrayList<List<Integer>>();for (int i = 0; i < numCourses; ++i) {edges.add(new ArrayList<Integer>());}for (int[] info : prerequisites) {edges.get(info[1]).add(info[0]);}visited = new int[numCourses];result = new int[numCourses];index = numCourses - 1;for (int i = 0; i < numCourses && !hasCircle; ++i) {if (visited[i] == 0) {dfs(i);}}if (hasCircle) return new int[0];return result;}public void dfs(int node) {visited[node] = 1;for (int n : edges.get(node)) {if (visited[n] == 0) {dfs(n);if (hasCircle) return;}else if (visited[n] == 1) {hasCircle = true;return;}}visited[node] = 2;result[index--] = node;}
}

很有趣的一点是:

edges = new ArrayList<List<Integer>>();

如果去掉了List<Integer>速度会变慢。

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

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

相关文章

linux查找文件中的指定字符,并批量替换文件中指定字符

1、grep -rl “jquery-1.8.0.min.js” /opt 查找/opt 目录下存在jquery-1.8.0.min.js的文件 [rootlocalhost file1]# grep -rl "jquery-1.8.0.min.js" /opt /opt/file1/index.xhtml /opt/file2/index.xhtml /opt/shell.sh扩展&#xff1a;使用该命令可以查找文件中…

DevEco Studio预览时报错:Build task failed. Open the Run window to view details.

图一&#xff1a; 解决方案 图二 &#xff1a; 图三&#xff1a; 按照以上图示步骤&#xff0c;去掉图三中3号标记的勾选

Android-消息机制Handler

Handler的机制:Android 消息传递机制就是handler。在多线程的应用场景中&#xff0c;将工作线程中需更新UI的操作信息 传递到 UI主线程&#xff0c;从而实现对UI的更新处理&#xff0c;最终实现异步消息的处理。多个线程并发更新UI的同时 保证线程安全。Handler只是一个入口&am…

Android studio ListView应用设计

一、添加ListView控件: <ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf=&qu…

Android开发 基于ARouter开源的路由框架的YmRouter

一、ARouter的简介 ARouter是一个用于Android的路由框架&#xff0c;它能够帮助开发者实现组件之间的通信和页面跳转。 ARouter的核心原理是通过注解来标记和生成路由映射表。开发者只需要在需要跳转的页面上添加注解&#xff0c;然后在代码中通过路由表找到对应的页面进行跳…

/usr/bin/ld: error: ../../lib/libnvinfer.so: file too short

一、背景 在编译TensorRT官方的C库时&#xff0c;库里是提供了命令行工具bin文件夹下的可执行程序trtexec&#xff0c;可以直接进行onnx的fp16以及int8量化&#xff0c;但我模型的输入是5维&#xff0c;模型里面全都是3D卷积&#xff0c;所以要对底层头文件进行修改。重新编译…

Python词云wordcloud库不显示中文

博主之前在项目中发现Python的词云库wordcloud显示的都是方框&#xff0c;别担心&#xff0c;我有一个妙招让你的中文词云变得美观又清晰&#xff01; 问题 wordcloud是一个基于python的词云生成库&#xff0c;它可以让你用简单的代码创建出各种形状和颜色的词云图像。 word…

工业数据采集分析——工厂大脑 提升综合经济效益

随着企业对数字化的认知越来越清晰&#xff0c;对工业数智化的战略越来越明确&#xff0c;企业的诉求也在发生转变。中国的工业企业经过近几十年的发展&#xff0c;自动化、信息化&#xff0c;以及一些基础的数据系统建设在不同的行业中慢慢地推进。近几年&#xff0c;工业企业…

STM32CubeMX配置STM32G031多通道UART+DMA收发数据(HAL库开发)

时钟配置HSI主频配置64M 配置好串口&#xff0c;选择异步模式 配置DMA TX,RX,选择循环模式。 NVIC中勾选使能中断 勾选生成独立的.c和h文件 配置好需要的开发环境并获取代码 串口重定向勾选Use Micro LIB main.c文件修改 增加头文件和串口重定向 #include <string.h&g…

C++ 基本字符转换

宽字符和窄字符的概念 宽字符和窄字符是与字符编码相关的概念&#xff0c;通常在处理多语言字符时会涉及到这些概念。 窄字符&#xff08;Narrow Character&#xff09;&#xff1a; 窄字符通常指的是单字节字符&#xff0c;使用单个字节来表示一个字符。在ASCII编码中&#…

第三节课作业

复现&#xff1a; 对mmagic的理解

【算法每日一练】- 今天回顾一下写过的最蠢的代码 #旅游买票 竞争主席 #哨兵游戏 #最大边权和

目录 今日知识点&#xff1a; 整体考虑&#xff0c;把问题转化成装大于一半的背包问题 两两点匹配问题&#xff0c;注意去重方式的dfs的写法 旅游买票 竞争主席 哨兵游戏 最大边权和 旅游买票 318C&#xff1a;要旅游n天&#xff0c;一共有两种选择&#xff0c;一种是买…

Vue3-44-Pinia- 安装步骤

介绍 本文介绍 在 vue3 中 安装 Pinia 的步骤 安装步骤 1、npm 安装 npm install pinia》 安装完成后可以看到 package.json 中添加了 pinia 的依赖信息 2、main.ts 中配置 // 引入 vue实例创建方法 import { createApp } from vue// 引入pinia import { createPinia } fro…

1. Logback介绍

Logback介绍 Logback旨在成为流行的log4j项目的继任者。它由Ceki Glc设计&#xff0c;他是log4j的创始人。它基于十年在设计工业级日志系统方 面的经验。结果产品&#xff0c;即logback&#xff0c;比所有现有的日志系统更快&#xff0c;具有更小的占用空间&#xff0c;有时差距…

C++ Web框架Drogon初体验笔记

这段时间研究了一下C的Web框架Drogon。从设计原理上面来说和Python的Web框架是大同小异的&#xff0c;但是难点在于编译项目上面&#xff0c;所以现在记录一下编译的过程。下面图是我项目的目录。其中include放的是头文件&#xff0c;src放的是视图文件&#xff0c;static放的是…

函数战争(栈帧)之创建与销毁(c语言)(vs2022)

首先&#xff0c;什么是函数栈帧&#xff1f; C语言中&#xff0c;每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录&#xff0c;是编译器用来实现过程函数调用的一种数据结构。 以问答的方式解释编译器与解释器-CSDN博客htt…

了解ASP.NET Core 中的文件提供程序

写在前面 ASP.NET Core 通过文件提供程序来抽象化文件系统访问。分为物理文件提供程序(PhysicalFileProvider)和清单嵌入的文件提供程序(ManifestEmbeddedFileProvider)还有复合文件提供程序(CompositeFileProvider )&#xff1b;其中PhysicalFileProvider 提供对物理文件系统…

Hyperledger Fabric Peer 配置解析

文中使用的 fabric 版本为 2.4.1 在 Fabric 网络中&#xff0c;用户可以设定 Peer 节点、排序节点、CA 节点的行为&#xff0c;以及管理通道、组织身份等多种资源&#xff0c;这都涉及网络内配置。 Fabric 节点在启动时可通过加载本地配置文件或环境变量等方式获取配置信息&am…

智数融合|低代码入局,推动工业数字化转型走"深"向"实"

当下&#xff0c;“数字化、智能化”已经不再是新鲜词汇。事实上&#xff0c;早在几年前&#xff0c;就有企业开始大力推动数字化转型&#xff0c;并持续进行了一段时间。一些业内人士甚至认为&#xff0c;“如今的企业数字化已经走过了成熟期&#xff0c;进入了深水区。” 但事…