LeetCode:210课程表Ⅱ(图论:拓扑排序判断是否有环)

做本题之前最好先做了LeetCode:207课程表,见本人另一篇博客http://t.csdnimg.cn/vSXgN

题目

现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。

例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:[0,1]
解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。
示例 2:

输入:numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
输出:[0,2,1,3]
解释:总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。
示例 3:

输入:numCourses = 1, prerequisites = []
输出:[0]

提示:
1 <= numCourses <= 2000
0 <= prerequisites.length <= numCourses * (numCourses - 1)
prerequisites[i].length == 2
0 <= ai, bi < numCourses
ai != bi
所有[ai, bi] 互不相同

思路

这道题和LC207不同的是,它需要返回拓扑排序的路径。除此之外,不在拓扑排序路径,或者说不在图中的节点也需要返回,但是无所谓插入的顺序。所以本人在最后判断了一下哪些节点没有在图中出现,然后插入在了拓扑排序节点数组的最后面。
注意返回空数组是return new int[0]不是return null;

代码

class Solution {public class Graph{public HashMap<Integer,Node> nodes;public HashSet<Edge> edges;public Graph(){nodes = new HashMap<>();edges = new HashSet<>();}}public class Node{public int value;public int in;public ArrayList<Node> nexts;public Node(int value){this.value = value;in=0;nexts = new ArrayList<>();}}public class Edge{public Node from;public Node to;public Edge(Node from, Node to){this.from = from;this.to = to;}}public Graph createGraph(int[][] prerequisites){Graph graph = new Graph();for(int i=0;i<prerequisites.length;i++){int fromVal = prerequisites[i][1];int toVal = prerequisites[i][0]; if(!graph.nodes.containsKey(fromVal)) graph.nodes.put(fromVal, new Node(fromVal));if(!graph.nodes.containsKey(toVal)) graph.nodes.put(toVal, new Node(toVal));Node fromNode = graph.nodes.get(fromVal);Node toNode = graph.nodes.get(toVal);Edge edge = new Edge(fromNode, toNode);toNode.in++;graph.edges.add(edge);fromNode.nexts.add(toNode);}return  graph;}public int[] findOrder(int numCourses, int[][] prerequisites) {int[] result = new int[numCourses];//存放结果Graph graph = createGraph(prerequisites);HashMap<Node,Integer> inMap = new HashMap<>();//一个节点对应的剩余的入度Queue<Node> zeroInQueue = new LinkedList<>();//存放着入度为0的节点for(Node node:graph.nodes.values()){inMap.put(node, node.in);if(node.in==0) zeroInQueue.add(node);}int realnum=0;//拓扑排序路径的节点,即不成环的节点数量while(!zeroInQueue.isEmpty()){Node cur = zeroInQueue.poll();result[realnum]=cur.value;realnum++;for(Node next:cur.nexts){int newin = inMap.get(next)-1;inMap.put(next,newin);if(newin==0) zeroInQueue.add(next);}}int num = graph.nodes.size();if(realnum!=num) return new int[0];//如果不成环的节点数和图中的节点数不相等,说明有环存在,返回一个空数组。int res=0;//res表示其他没在图中出现的节点的数量if(numCourses!=num){//如果课程数和图的节点数不相等,直接判断是哪些节点没有在图中出现,插入到result最后面。for(int i=0;i<numCourses;i++){if(!graph.nodes.containsKey(i)) {result[realnum+res]=i;res++;}}}return result;}
}

13ms,击败14.65%使用 Java 的用户

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

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

相关文章

sql常用函数积累(非窗口函数)

1.concat 在 SQL 中&#xff0c;concat函数用于将两个或多个字符串值连接成一个字符串 例如&#xff0c;如果有一个包含姓氏&#xff08;last_name&#xff09;和名字&#xff08;first_name&#xff09;的表&#xff0c;可以使用 CONCAT 来生成一个完整的姓名&#xff1a; …

JVM之GC垃圾回收

GC垃圾回收 如何判断对象可以回收 引用计数法 如果有对象引用计数加一&#xff0c;没有对象引用&#xff0c;计数减一&#xff0c;如果计数为零&#xff0c;则回收 但是如果存在循环引用&#xff0c;即A对象引用B对象&#xff0c;B对象引用A对象&#xff0c;会造成内存泄漏 可…

Gitlab和Jenkins集成 实现CI (二)

Gitlab和Jenkins集成 实现CI (一) Gitlab和Jenkins集成 实现CI (二) Gitlab和Jenkins集成 实现CI (三) 配置Gitlab api token 配置 Gitlab 进入gitlab #mermaid-svg-t84fR8wrT4sB4raQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:…

【芯片设计- RTL 数字逻辑设计入门 6 -- 带同步复位的D触发器 RTL实现及testbench 验证】

文章目录 带同步复位的D触发器Verilog 代码testbench 代码编译及仿真问题小结 带同步复位的D触发器 同步复位 &#xff1a;复位只能发生在在clk信号的上升沿&#xff0c;若clk信号出现问题&#xff0c;则无法进行复位。 Verilog 代码 // timescale ins/1nsmodule flopr (inpu…

第60讲公共Tabs组件封装

新建Tabs组件 Tabs.wxml <view class"tabs"><view class"tabs_title"><viewbindtap"handleItemTap"data-index"{{index}}"wx:for"{{tabs}}"wx:key"id"class"title_item {{item.isActive?ac…

Django(十)

1. Ajax请求 浏览器向网站发送请求时&#xff1a;URL 和 表单的形式提交。 GETPOST 特点&#xff1a;页面刷新。 除此之外&#xff0c;也可以基于Ajax向后台发送请求&#xff08;偷偷的发送请求&#xff09;。 依赖jQuery编写ajax代码 $.ajax({url:"发送的地址"…

如何利用chatgpt提升工作效率?

在数字化和信息化的时代&#xff0c;人工智能技术已经深入到了我们生活的方方面面。其中&#xff0c;ChatGPT作为当前热门的人工智能技术&#xff0c;以其强大的自然语言处理能力和广泛的应用场景&#xff0c;正逐渐改变着我们的工作方式&#xff0c;为我们提高工作效率提供了全…

电脑服务器离线安装.net framework 3.5解决方案(错误:0x8024402c )(如何确定当前系统是否安装NET Framework 3.5)

问题环境&#xff1a; 日常服务的搭建或多或少都会有需要到NET Framework 3.5的微软程序运行框架&#xff0c;本次介绍几种不同的安装方式主要解决运行在Windows 2012 以上的操作系统的服务。 NET Framework 3.5 是什么&#xff1f; .NET Framework是微软公司推出的程序运行框架…

BTC交易数据 - 文章索引

BTC交易数据系列文章索引 如果你对比特币交易技术感兴趣&#xff0c;这一系列深度解析文章绝对值得一读。从 BTC 交易数据的总览、VarInt 类型的详解&#xff0c;到 nLockTime 的应用和比特币脚本的执行过程&#xff0c;每篇文章都揭示了比特币交易背后的精妙机制。无论你是初学…

vscode +markdown 的安装和使用

文章目录 前言一、vscode markdown 是什么&#xff1f;1.vscode是什么&#xff1f;2.markdown 是什么&#xff1f; 二、安装步骤1.下载2.安装 三、安装插件1.安装 Markdown All in One2.安装 Markdown Preview Enhanced3. Paste Image v1.0.44.LimfxCodeExv0.7.105.Code Spell …

【小程序】基础API——多语言API接口介绍

ty.getLangContent 获取多语言 需引入BizKit&#xff0c;且在>3.0.0版本才可使用 参数 Object object 属性类型默认值必填说明completefunction否接口调用结束的回调函数&#xff08;调用成功、失败都会执行&#xff09;successfunction否接口调用成功的回调函数failfunc…

问题:孔隙比总是1.0。 #知识分享#微信

问题&#xff1a;孔隙比总是1.0。 /ananas/latex/p/1242 参考答案如图所示

深度学习技巧应用36-深度学习模型训练中的超参数调优指南大全,总结相关问题与答案

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用36-深度学习模型训练中的超参数调优指南大全,总结相关问题与答案。深度学习模型训练中的调优指南大全概括了数据预处理、模型架构设计、超参数优化、正则化策略和训练技巧等多个关键方面,以提升模型性能和泛化能力。 …

【Java】苍穹外卖 Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; 管理端-外卖商家使用用户端-点餐用户使用当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一名软件开…

arm 平台安装snort3

本文来自原创,转载请说明来源。谢谢配合。 选择初衷 最近在学习渗透相关课程,回想起曾经拥有自己的域名和服务器的经历。不幸的是,服务器被注入了木马文件,起初并没有察觉。直到我加入了定时任务,才发现了这个问题。当时我下定决心要打造一个安全的网站,以保护自己的网…

在 MacOS 上虚拟化 x86Linux 的最佳方法(通过 Rosetta)

categories: [VM] tags: MacOS VM 写在前面 买了 ARM 的 mac, 就注定了要折腾一下虚拟机了… 之前写过一篇文章是通过 utm 虚拟化archlinux, 其实本质上还是调用了 qemu-system-x86_64, 所以速度并不快, 后来想着能不能借用 Rosetta 的优势即原生转译, 来虚拟化 Intel 的 Linu…

Vue.js2+Cesium1.103.0 十五、绘制视锥,并可实时调整视锥姿态

Vue.js2Cesium1.103.0 十五、绘制视锥&#xff0c;并可实时调整视锥姿态 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"/> </template><script> /* eslint-disable no-undef */ /* eslint-disable …

MySQL篇----第十五篇

系列文章目录 文章目录 系列文章目录前言一、实践中如何优化 MySQL二、优化数据库的方法三、简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

DevOps文章之 操作手册用户使用说明书

前言 最近主导了几个项目操作手册的编写。有新开发的项目&#xff0c;要重新编写操作手册&#xff1b;有中途接手别的项目&#xff0c;后来功能迭代&#xff0c;需要更新原操作手册&#xff1b;有客户对操作手册有意见&#xff0c;需要调整&#xff1b;零零散散写了数万字的手…

智慧自助餐饮系统(SpringBoot+MP+Vue+微信小程序+JNI+ncnn+YOLOX-Nano)

一、项目简介 本项目是配合智慧自助餐厅下的一套综合系统&#xff0c;该系统分为安卓端、微信小程序用户端以及后台管理系统。安卓端利用图像识别技术进行识别多种不同菜品&#xff0c;识别成功后安卓端显示该订单菜品以及价格并且生成进入小程序的二维码&#xff0c;用户扫描…