LeetCode - 685. 冗余连接 II

. - 力扣(LeetCode)

题目

在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。

输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 到 n)的树及一条附加的有向边构成。附加的边包含在 1 到 n 中的两个不同顶点间,这条附加的边不属于树中已存在的边。

结果图是一个以边组成的二维数组 edges 。 每个元素是一对 [ui, vi],用以表示 有向 图中连接顶点 ui 和顶点 vi 的边,其中 ui 是 vi 的一个父节点。

返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。

示例 1:

输入:edges = [[1,2],[1,3],[2,3]]
输出:[2,3]

示例 2:

输入:edges = [[1,2],[2,3],[3,4],[4,1],[1,5]]
输出:[4,1]

错误尝试

这是LeetCode-684. 冗余连接-CSDN博客的一个延伸题,首先我尝试了一下直接用基础的差并集方法是否可解:

class Solution:def findRedundantDirectedConnection(self, edges: List[List[int]]) -> List[int]:n = len(edges)# 定义关系集合relataions = [[i] for i in range(1, n+1)]for edge in edges:node_0 = edge[0]node_1 = edge[1]# 逐条更新关系集合if relataions[node_0 - 1] != relataions[node_1 - 1]:index = min(relataions[node_0 - 1], relataions[node_1 - 1])max_index = max(relataions[node_0 - 1], relataions[node_1 - 1])relataions = [index if i == max_index else i for i in relataions ]else:return edge  # 返回多余边return []

提交后报错:

分析出错原因: 

解题过程如下图所示。

[2, 1] 和 [1, 4] 是环里面的两条边,去掉任意一条环都可以解开,对于无向树固然成立。

但是题目中的树是有向的,只能去掉[2, 1],才能形成一条正确的树。

正确解题思路: 

基于并查集的解法

  • 根据题目描述,这是一棵只有一条附加边的有向树,
    • 根据树的性质,节点数量 = 边的数量 + 1, 所以这棵多了一条附加边的有向树,节点的数量 = 边的数量
    • 环的性质:环上的任意两个节点可以找到一个共同的子节点
    • 根据树的性质,根节点入度为0, 其余节点入度为1。添加一条附加边后会出现什么现象呢?
      • 情况1:如果附加边指向根节点,则所有节点入度为1(即所有节点都只有1个父节点),此时一定存在环,即存在1条环路边(即加入后使图中出现环路的边),此时删除环路边即可。
      • 如果附加边不指向根节点,则存在一个子节点入度为2(存在1个节点,有2个父节点),
        • 情况2:此时可能不存在环(如第二个图):那么此时只有1条冲突边(即与其他边指向同一个子节点的边),此时删除冲突边即可。
        • 情况3:也可能存在环(如第三个图):此时存在1条冲突边和1条环路边,此时删除导致环路的冲突边

接下来完成代码: 

class Solution:def findRedundantDirectedConnection(self, edges: List[List[int]]) -> List[int]:n = len(edges)parents = list(range(n + 1)) # 记录每个节点的父节点child = list(range(n + 1))def find(index: int) -> int:"""返回当前节点对应的最新子节点同时把路径上所有节点都更新最指向最新子节点"""if child[index] != index:child[index] = find(child[index]) # 更新所有child为最新childreturn child[index] # 返回最后一条边加入后的子节点def union(node_0: int, node_1: int):child[find(node_0)] = find(node_1)conflict = -1 cycle = -1for index, (node_0, node_1) in enumerate(edges):if parents[node_1] != node_1:# 初始状态下node的父节点是自身;# 此时node_1 已经有父节点,因此出现冲突conflict = indexelse:parents[node_1] = node_0 # 更新父节点记录if find(node_0) == find(node_1):# 出现环路cycle = indexelse:union(node_0, node_1)if conflict < 0:# 根据前面分析的三种情况,如果无冲突,则一定有环路return edges[cycle]elif cycle < 0:# 根据前面分析的三种情况,如果无环路,则一定有冲突return edges[conflict]else:# 同时有环路和冲突,删除导致环路的冲突边return [parents[edges[conflict][1]], edges[conflict][1]]

 分析复杂度:

  • 时间复杂度:遍历n条边,对于第k条边,最多需要进行2k次查找(2个节点调用find),因此时间复杂度是O(nlogn)
  • 空间复杂度:parents和child数组都是(n+1)个元素,因此需要2(n+1)的空间,空间复杂度是O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

1-磁盘建立空闲分区

学习目标&#xff1a; 掌握磁盘分区的基本知识和操作技能&#xff0c;能够独立创建和管理磁盘空闲分区&#xff0c;以优化存储空间和提高系统性能&#xff0c;为后续的系统安装和数据管理打下基础。 学习内容&#xff1a; 1 选择一个适合的磁盘分区软件。推荐DiskGenius、Par…

文件系统(IO-进程-线程)

目录 IO 同步/异步/阻塞/非阻塞/BIO/NIO/AIO 阻塞IO模型 非阻塞IO模型 多路复用IO模型 异步IO模型 IO模型总结 零拷贝 传统的文件传输有多糟糕&#xff1f; 使用零拷贝技术的项目 进程 进程的控制结构 什么是线程&#xff1f; 线程与进程的比较 IO模型 Java IO…

QT中客户端 服务器

客户端 对于我们网络编程中 客户端 服务器,Q的步骤 那在我们qt当中 因为qt是基于我们面向对象的编程 首先我们需要一个socket 就是QTcpSocket 我们需要从我们editline中获取我们输入的ip地址跟端口号 就是QString ip ui->editline->text(); 获取之后利用我们soc…

第三次RHCSA作业

1、配置网络&#xff1a;为网卡添加一个本网段IPV4地址&#xff0c;x.x.x.123 2、配置yum本地仓库&#xff0c;并完成traceroute命令的安装 yum库配置成功过后&#xff0c;显示这个报错&#xff0c;没能写完 3、用至少两种方法查看sshd服务的进程号 4、添加一块10G大小的磁盘&…

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能

文章目录 一、RabbitMq 下载安装二、开发步骤&#xff1a;1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网&#xff1a;https://www.rabbitmq.com/docs 二、开发步骤&#xff1a;…

Windows达梦8数据库:本地编码:PG_GBK, 导入文件编码:PG_UTF8错误最优解决方法

在windows使用达梦8DM管理工具直接导入.dmp文件(可能是从Linux导出的)时出现该错误 错误如下 解决方案如下&#xff1a; 1、重新建立UTF-8编码的数据库 2、新建一个模式 3、使用CMD 命令进行导入 找到DM数据库的安装路径的bin 目录下 cmd 进入终端&#xff0c;使用命令&…

【含文档】基于ssm+jsp的传统文化学习系统的设计与实现(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统主要有管…

计算机网络:网络层 —— 网际组管理协议 IGMP

文章目录 IP多播协议网际组管理协议IGMPIGMP的三种报文类型IGMP的基本工作原理加入多播组监视多播组的成员变化多播路由器发送IGMP成员查询报文多播组成员发送IGMP成员报告报文多播路由器移除多播组成员注意事项 退出多播组 IP多播协议 要在因特网上进行IP多播&#xff0c;就必…

每日读则推(十四)——Meta Movie Gen: the most advanced media foundation models to-date

premiere n.首映,首次公演 v.首次公演(戏剧、音乐、电影) a.首要的,最早的 Today we’re premiering Meta Movie Gen: the most advanced media foundation models to-date. 迄今,到现在为止 …

使用Deno进行现代Web开发

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 [TOC] 引言 Deno 是一个现代的、安全的、基于 V8 引擎的 JavaScript 和 TypeScript 运行时&#xff0c;由 Node.js 的作者 Rya…

C++设计模式结构型模式———适配器模式

文章目录 一、引言二、适配器模式三、类适配器四、总结 一、引言 适配器模式是一种结构型设计模式&#xff0c;它在日常生活中有着广泛的应用&#xff0c;比如各种转换接头和电源适配器&#xff0c;它们的主要作用是解决接口不兼容的问题。就像使用电源适配器将220V的市电转换…

交换机如何实现2.5G网络传输速率和网络变压器有关吗

华强盛电子导读&#xff1a;I19926430038 交换机实现2.5G网络传输速率涉及多个因素&#xff0c;其中包括硬件设计、端口支持、传输介质以及网络协议等。网络变压器在其中扮演了一个重要的角色&#xff0c;但并不是唯一的因素。 1. **硬件设计**&#xff1a;交换机需要有支持2.…

Centos环境下安装docker

本文演示离线版安装用于没有网络环境的系统 在线版安装可参考以下链接 https://www.runoob.com/docker/centos-docker-install.html 一、docker离线安装 1、下载docker离线安装包 docker下载地址&#xff1a; Docker版本下载 选择版本 下载后上传至服务器 百度网盘下载…

微软官方 .NET 混淆软件 Dotfuscator

微软官方 .NET 混淆软件 Dotfuscator 1、前言2、Dotfuscator 特色2.1、强大的保护2.2、不需要顾问2.3、世界一流的支持2.4、广泛的平台支持 3、Dotfuscator 功能介绍3.1、.NET Obfuscator3.2、篡改防御和提示3.3、监控性能和使用情况3.4、Silverpght XAML Obfuscatio3.5、WPF B…

深入浅出:SM4 加密算法及其多种工作模式详解

深入浅出&#xff1a;SM4 加密算法及其多种工作模式详解 引言 SM4 是中国国家密码管理局定义的对称分组加密算法&#xff0c;广泛应用于无线局域网安全协议等领域。作为中国商用密码算法之一&#xff0c;SM4 采用 128 位的分组长度和密钥长度&#xff0c;提供了高效且安全的加…

摄像机实时接入分析平台LiteAIServer视频智能分析软件诊断噪声检测

在科技日新月异的今天&#xff0c;视频监控系统的应用日益广泛&#xff0c;从公共安全到家庭防护&#xff0c;从生产线管理到交通监控&#xff0c;视频监控已经成为现代社会不可或缺的一部分。然而&#xff0c;噪声问题一直是影响视频画面清晰度和可用性的关键因素。为了解决这…

NumPy安装

1.NumPy简介 NumPy(Numerical Python) 是 Python 语言的扩展程序库&#xff0c;支持大量维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早由 Jim Hugunin 与其它协作者共同开发&#xff0c;2005 年&#xff0c;Travis Oliph…

推荐几款TOP级AI驱动的单元测试工具

这篇文章&#xff0c;我想对开发人员人员来说更有帮助&#xff0c;毕竟开发同学“苦单元测试久已”&#xff01; 软件开发是一项创造性的工作&#xff0c;但其中也包含着许多乏味的任务。其中最乏味的莫过于编写“单元测试”了&#xff0c;用于验证软件组件是否按预期工作。单…

C#的Event事件示例小白级剖析

1、委托Delegate 首先说一下delegate委托&#xff0c;委托是将方法作为参数进行传递。 // 定义了一个委托类型public delegate void MyDelegate(int num);// 定义了一个啥也不干的委托实例public MyDelegate m_delegate _ > {};// 定义了一个和委托相同格式的方法public …

JWT-混淆算法

jwt - RS256&#xff08;RSA SHA-256&#xff09; 题目来源&#xff1a;DownUnderCTF2021 Web jwt 外国的比赛&#xff0c;找不到线上的环境了&#xff0c;github中有Docker&#xff0c;拖下来用docker生成一个本地环境 原题wp链接&#xff1a; https://ctftime.org/write…