LeetCode-684. 冗余连接

news2024/10/28 22:31:44

. - 力扣(LeetCode)

题目

树可以看成是一个连通且 无环 的 无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的那个。

示例 1:

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

示例 2:

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

解题方法

  • 这个解题方法没有推导之类的技巧,需要记住使用“并查集”来解决。
    • 什么是“并查集”呢?在计算机科学中,并查集(英文:Union-find Disjoint-set data structure,直译为合并查询无交集数据结构)是一种数据结构,通过查询,合并一些无交集数据的问题。
    • 经典“并查集”题目:若某个家族人员过于庞大,现在给出家族人数为n,实际存在的m条亲戚关系,询问另外的p对亲戚关系是否成立?

  • 题目中给出的图是“给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图”,
    • 根据树的常识可以知道一个有n个节点的树,有n-1条边。
    • 题目中的图,则是n个节点, n-1+1=n条边,即给定边的个数 即为 节点的个数

直接编码如下:

class Solution:
    def findRedundantConnection(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 []

时间复杂度分析

  • 边的个数记为n,可以看到每遍历一个边关系,就对relations数组进行一次全量更新,因此时间复杂度为O(n^2)

标准并查集写法(优化更新relations数组的方式)

class Solution:
    def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
        n = len(edges)
        relataions = [i for i in range(n+1)] # 多一个无效的relations[0]元素,便于后续索引操作
        def find(index: int) -> int:
            if relataions[index] != index:
                relataions[index] = find(relataions[index])
            return relataions[index]
        
        def union(index_1: int, index_2: int):
            relataions[find(index_1)] = find(index_2)
            
        for node1, node2 in edges:
            if find(node1) != find(node2):
                # node1 和 node2 当前不在一个集合中,此关系是有效的新关系,则更新关系状态
                union(node1, node2)
            else:
                return [node1, node2]
        return []
                

时间复杂度分析:

  • 交集时仅操作单个元素,因此时间复杂度为O(n)

AI如何解答这道题呢?

智谱清言 正确的解答了这道题目,只是在并集操作上多存储了一个rank数组,略显复杂。

又是被AI替代的一天啊

def findRedundantConnection(edges):
    def find(parent, x):
        if parent[x] != x:
            parent[x] = find(parent, parent[x])  # 路径压缩
        return parent[x]

    def union(parent, rank, x, y):
        rootX = find(parent, x)
        rootY = find(parent, y)
        if rootX != rootY:
            if rank[rootX] > rank[rootY]:
                parent[rootY] = rootX
            elif rank[rootX] < rank[rootY]:
                parent[rootX] = rootY
            else:
                parent[rootY] = rootX
                rank[rootX] += 1
            return False
        return True

    parent = {}
    rank = {}
    for a, b in edges:
        if a not in parent:
            parent[a] = a
            rank[a] = 0
        if b not in parent:
            parent[b] = b
            rank[b] = 0

    for a, b in edges:
        if union(parent, rank, a, b):
            return [a, b]

# 示例
edges = [[1,2], [1,3], [2,3]]
print(findRedundantConnection(edges))  # 输出: [2, 3]

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

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

相关文章

传输层UDP

再谈端口号 端口号&#xff1a;标识了主机上进行通信的不同的应用程序 在TCP/IP 协议中我们用“源IP”"源端口号" “目的IP”“目的端口号” “协议号”五元组来标识一个通信 用netstat -n 查看 查看网络信息&#xff0c;我们有两种命令查看网络通信1.用netsta…

Python | Leetcode Python题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution:def fib(self, n: int) -> int:if n < 2:return nq [[1, 1], [1, 0]]res self.matrix_pow(q, n - 1)return res[0][0]def matrix_pow(self, a: List[List[int]], n: int) -> List[List[int]]:ret [[1, 0], [0, …

1 环境配置、创建功能包、编译、Cmake文件及package文件学习笔记

1 基本结构 放张 赵虚左老师的pdf截图 2 环境配置 //每次都需配置 . install/setup.bash//或者一次配置echo "source /path/to/your/workspace_name/install/setup.bash" >> ~/.bashrcsource ~/.bashrc3 创建功能包 ros2 pkg create 包名--build-type 构建类…

气象监测软件的程序设计

老师留了个作业&#xff0c;感觉挺有意思&#xff0c;记录一下 文章目录 气象监测软件的程序设计项目指导书&#xff08;一&#xff09;基本信息&#xff08;二&#xff09;项目目标&#xff08;三&#xff09;任务描述&#xff08;四&#xff09;指导内容任务 1&#xff1a;根…

电磁干扰(EMI)与电磁兼容性(EMC)【小登培训】

电磁干扰&#xff08;EMI&#xff09;和电磁兼容性&#xff08;EMC&#xff09;是每个产品在3C &#xff0c;CE认证过程中必不可少的测试项目&#xff1a; 一、电磁干扰&#xff08;EMI&#xff09; EMI&#xff08;Electromagnetic Interference&#xff09;是指电子设备在工作…

ARM学习(33)英飞凌(infineon)PSOC 6 板子学习

笔者来聊一下psoc62 系列板子的知识 1、PSOC62板子介绍 Psoc6-evaluationkit-062S2 与RT-Thread联合推出的一款32位的双core的板子&#xff0c;基于CortexM4以及CortexM0。 管脚兼容Arduio。板载DAP-Link&#xff0c;可以支持调试以及串口&#xff0c;无需外接2MB的Flash以及…

JavaEE初阶---文件IO总结

文章目录 1.文件初识2.java针对于文件的操作2.1文件系统的操作---file类2.2文件内容的操作---流对象的分类2.4字符流的操作》文本文件2.4.1异常的说明2.4.2第一种文件内容的读取方式2.4.3第二种读取方式2.4.4close的方法的介绍2.4.5close的使用优化操作2.4.6内容的写入 2.3字节…

数据结构与算法汇总整理篇——数组与字符串双指针与滑动窗口的联系学习及框架思考

数组 数组精髓&#xff1a;循环不变量原则 数组是存放在连续内存空间上的相同类型数据的集合&#xff0c;通过索引(下标)访问元素&#xff0c;索引从0开始 随机访问快(O(1)时间复杂度)&#xff1b;插入删除慢(需要移动元素)&#xff1b;长度固定(部分语言中可动态调整) 其存…

【CSS】边界三角形

有三角形 Unicode 字符。您可以在 SVG 中绘制三角形。但还有另一种在 Web 上绘制三角形的方法&#xff0c;只需使用 border 属性和一些 CSS 技巧即可。 想象一个具有粗边框的元素&#xff1a; .triangle {width: 200px;height: 200px;border: 10px solid black; }现在想象一下…

公园客流统计系统根据游客数量安排清洁人员

公园作为人们休闲娱乐的公共场所&#xff0c;游客流量时常处于动态变化中。而公园客流统计系统的应用&#xff0c;为依据游客数量合理安排清洁人员提供了有效途径&#xff0c;主要体现在以下几个方面。 一、精准掌握游客分布&#xff0c;按需调配清洁力量 公园客流统计系统能够…

Es可视化界面 ElasticHd

前言 在开发的过程中&#xff0c;有一个可视化界面工具&#xff0c;以及一个可执行的es相关语句的工具十分重要&#xff0c;主要有以下这些 1. Kibana‌&#xff1a;○ Kibana是Elastic官方提供的数据可视化工具&#xff0c;功能强大&#xff0c;支持多种图表类型&#xff0c…

REST APIs与微服务:关键差异

在构建基于微服务的应用程序时RESYful API和微服务这两个术语经常相伴出现。然而&#xff0c;它们指的是截然不同的东西。 了解 RESTful API 和微服务之间差异的最简单方式是这样&#xff1a; 微服务&#xff1a;它们是构成更大规模基于微服务的应用程序的单个服务和功能&…

雷池社区版OPEN API使用教程

OPEN API使用教程 新版本接口支持API Token鉴权 接口文档官方没有提供&#xff0c;有需要可以自行爬取&#xff0c;爬了几个&#xff0c;其实也很方便 使用条件 需要使用默认的 admin 用户登录才可见此功能版本需要 > 6.6.0 使用方法 1.在系统管理创建API TOKEN 2.发…

参会记录|2024 中国计算机大会(CNCC 2024)

前言&#xff1a;2024年10月24-26日&#xff0c;有幸在横店参加了2024年度的中国计算机大会&#xff08;CNCC&#xff09;&#xff0c;本篇博客总结本人在会议期间收听的主要报告内容及收获。 2024.10.24 上午 夏苑海岳开襟 如何实现人工智能在现实场景中的落地&#xff1f; …

解锁V2G:电动汽车如何化身电网“充电宝”,最重要的是将成为一种赚钱的方式!

解锁V2G&#xff1a;电动汽车如何化身电网“充电宝” 随着新能源汽车的普及&#xff0c;电动汽车不仅仅是交通工具&#xff0c;还能成为电网的重要补充。今天&#xff0c;我们来聊聊V2G&#xff08;Vehicle-to-Grid&#xff09;技术&#xff0c;看看它是如何实现车辆与电网之间…

Git相关介绍

基本概念 关注&#xff08;watch&#xff09; 关注项目&#xff0c;当项目更新可以接收到通知 事物卡片&#xff08;Issue&#xff09; 发现代码BUG&#xff0c;但是目前没有成型代码&#xff0c;需要讨论时用 Git工作区域 工作区 添加、编辑、修改文件等动作 暂存区 …

蓝海创意云入选中国夏衍电影学会工业与科技影视专业委员会成员单位

党的二十届三中全会指出&#xff0c;科技自立自强是中国式现代化的有力保障。科技兴则民族兴&#xff0c;科技强则国家强。为深入的贯彻落实这一重要部署&#xff0c;推动工业与科技领域的融合发展充分发挥电影艺术在传播科技创新精神、展现工业发展成就方面的独特作用&#xf…

【AI大模型】使用谷歌 Gemini API 构建自己的 ChatGPT(二)

上一篇文章 【AI大模型】使用谷歌 Gemini API 构建自己的 ChatGPT&#xff08;一&#xff09;&#x1f680;我们介绍了 Gemini 是什么&#xff0c;以及如何使用Gemini 构建一个多模态的聊天场景示例。这一篇我们使用 langchain 与 Gemini 集成构建应用&#xff1a; 将 Langcha…

C/C++:WinSock_TCP通信实例

一、socket函数 第一种使用socket函数来创建套接字&#xff0c;函数调用成功将返回套接字句柄。 socket函数接收三个参数。af 、type 、protocol af&#xff1a;指定套接字使用的地址格式。 type&#xff1a;指定套接字的类型。 protocol&#xff1a;配合type参数使用&#xf…

Appium中的api(二)

目录 元素定位操作api 1--通过id定位api 2--通过class获取定位元素 3--通过xpath表达式定位元素 4.完整代码 解释 效果 元素定位操作api 1--通过id定位api 注:driver.find_element是获取单个元素 # 通过id获取 mySearchId "com.android.settings:id/search_acti…