leetcode - 684. 冗余连接

684. 冗余连接

解决思路

大致上的思路就是将元素加入到 并查集 中,那么在遍历到边的时候先去判断的边的两个端点的 根节点 是否相等,如果相等,那么就代表此刻把这条边加上去就形成了环【可以这么理解,如果形成了环,那么两个端点在环内从那个端点出发都可以到达环内所有节点,只是这里提取出共同的 根节点罢了】

并查集

并查集(Union Find):一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。不交集指的是一系列没有重复元素的集合。

  • 合并(Union):将两个集合合并成一个集合。
  • 查找(Find):确定某个元素属于哪个集合。通常是返回集合内的一个「代表元素」。

并查集代码例子

public class UnionFind {public static class Element<V> {public V value;public Element(V value) {this.value = value;}}public static class UnionFindSet<V> {public HashMap<V, Element<V>> elementMap;// key: 某个元素,value: 该元素的父public HashMap<Element<V>, Element<V>> fatherMap;// key: 某个集合的代表元素,value: 该集合的大小public HashMap<Element<V>, Integer> sizeMap;public UnionFindSet(List<V> list) {elementMap = new HashMap<>();fatherMap = new HashMap<>();sizeMap = new HashMap<>();for (V value : list) {Element<V> element = new Element<>(value);elementMap.put(value, element);// 初始化都是自己指向自己,也就是代表元素fatherMap.put(element, element);sizeMap.put(element, 1);}}/*** 给定一个 element,往上一直找,把代表元素(fatherMap 指向自己的为代表元素)返回* @param element* @return*/public Element<V> findHead(Element<V> element) {Stack<Element<V>> path = new Stack<>();// 查找代表元素while (element != fatherMap.get(element)) {path.push(element);element = fatherMap.get(element);}while (!path.isEmpty()) {// 将路径上的 element,直接指向 代表元素,加快下次的查找速度fatherMap.put(path.pop(), element);}return element;}/*** 判断是不是在同一个集合* @return*/public boolean isSameSet(V a, V b) {if (elementMap.containsKey(a) && elementMap.containsKey(b)) {return findHead(elementMap.get(a)) == findHead(elementMap.get(b));}return false;}/*** 将两个集合合并,小的集合加入大的集合中* @param a* @param b*/public void union(V a, V b) {if (elementMap.containsKey(a) && elementMap.containsKey(b)) {Element aF = findHead(elementMap.get(a));Element bF = findHead(elementMap.get(b));if (aF != bF) {Element<V> big = sizeMap.get(aF) >= sizeMap.get(bF) ? aF : bF;Element<V> small = big == aF ? bF : aF;fatherMap.put(small, big);sizeMap.put(big, sizeMap.get(aF) + sizeMap.get(bF));// 不是代表元素了,所以删除掉sizeMap.remove(small);}}}}}

解决

参考链接:. - 力扣(LeetCode)

/*** 使用 并查集的 方法【参考官方】* 执行用时分布 1 ms 击败 62.07% 复杂度分析 消耗内存分布 42.10 MB 击败 61.45%* @param edges* @return*/
public int[] findRedundantConnection(int[][] edges) {int[] parent = new int[edges.length + 1];// 初始化,将所有的节点指向自己for (int i = 0; i < parent.length; i++) {parent[i] = i;}for (int[] edge : edges) {int node1 = edge[0];int node2 = edge[1];// 如果父节点一样,代表已经形成环了if (findHead(parent, node1) == findHead(parent, node2)){return edge;}union(parent, edge);}return new int[0];
}/*** 查找 根节点,并将 递归路径上的 节点都指向 根节点*/
public int findHead(int[] parent, int element){if (parent[element] != element){// 递归获取根节点parent[element] = findHead(parent, parent[element]);}return parent[element];
}/**
* 将数据加入到  并查集
*/
public void union(int[] parent, int[] edge){// 只是一个方向性的问题// 就是获取到 端点 0 的根节点,然后将它指向 端点 1 的根节点// 这种做法是为了直接指向根节点,如果是直接指向,会造成不是指向自己的根节点parent[findHead(parent, edge[0])] = findHead(parent, edge[1]);
}

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

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

相关文章

【力扣打卡系列】二叉树·灵活运用递归

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day16 相同的树 题目描述 解题思路 边界条件&#xff0c;其中一个节点为空&#xff0c;return 只有p和q均为空才返回true&#xff0c;因此可以简写为pqreturn&#xff0c;先判断节点值是否一样&…

【网安案例学习】暴力破解攻击(Brute Force Attack)

### 案例与影响 暴力破解攻击在历史上曾导致多次重大安全事件&#xff0c;特别是在用户数据泄露和账户被盗的案例中。随着计算能力的提升和密码管理技术的进步&#xff0c;暴力破解的威胁虽然有所减弱&#xff0c;但仍需警惕&#xff0c;特别是在面对高价值目标时。 【故事一…

创建一个基于SSM框架的药品商超管理系统

创建一个基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的药品商超管理系统是一个涉及多个步骤的过程。以下是一个详细的开发指南&#xff0c;包括项目结构、数据库设计、配置文件、Mapper接口、Service层、Controller层和前端页面的示例。 1. 需求分析 明…

二十七、Python基础语法(面向对象-上)

面向对象&#xff08;oop&#xff09;&#xff1a;是一种程序设计的方法&#xff0c;面向对象关注的是结果。 一、类和对象 类和对象&#xff1a;是面向对象编程中非常重要的两个概念。 类&#xff1a;具有相同特征或者行为的一类事物&#xff08;指多个&#xff09;的统称&…

【一分钟配置Python环境变量

配置Python环境变量可以帮助系统找到Python解释器和相关工具。下面是如何在不同操作系统上配置Python环境变量的步骤&#xff1a; Windows 1.安装Python&#xff1a; 在官方网站下载并安装Python&#xff0c;安装过程中选择“Add Python to PATH”选项。 手动配置环境变量&a…

(蓝桥杯C/C++)——STL(上)

目录 一、vector 1.vector的定义和特性 2.vector的常用函数 3.vector排序去重 二、map 1.map 2.multimap 3.unordered_map 三、stack 1.stack的定义和结构 四、pair 1.pair的定义和结构 2.pair的嵌套 3.pair自带的排序规则 一、vector 1.vector的定义和特性 C中&…

UML图之对象图详解

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 零、什么是对象图 对象图&#xff08;Object Diagram&#xff09;是UML中一种重要的静态结构图&#xff0c;它用于表示在特定时间点上系统中的对…

同三维T80004EHH-4K30W 4K超清HDMI编解码器

1路HDMI输入1路3.5音频输入&#xff0c;1路HDMI输出1路3.5音频输出&#xff0c;1个USB1个TF卡槽&#xff0c;带RS485 支持4K30&#xff0c;支持2路解码2路转码&#xff0c;可选配WEBRTC/NDI协议&#xff0c;可选配硬件WEBRTC解码&#xff0c;编码、解码、转码、导播、录制多功…

设计一个灵活的RPC架构

RPC架构 RPC本质上就是一个远程调用&#xff0c;需要通过网络来传输数据。传输协议可以有多种选择&#xff0c;但考虑到可靠性&#xff0c;一般默认采用TCP协议。为了屏蔽网络传输的复杂性&#xff0c;需要封装一个单独的数据传输模块用来收发二进制数据&#xff0c;这个单独模…

网络安全入门学习路线 怎样科学的进行网络安全学习

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

“中信同业+”焕新升级 锚定数字金融新主线,做实金融“五篇大文章”

9月20日&#xff0c;“中信同业”升级发布会及生物多样性债券指数发布在京顺利举办&#xff0c;此次活动以“做强数字金融 服务实体经济”为主题&#xff0c;由中信金控指导&#xff0c;中信银行主办&#xff0c;中信各金融子公司联合承办。来自银行、证券、保险、基金等行业百…

‌Linux tac命令‌

‌Linux tac命令‌是一个用于逆序显示文件内容的工具&#xff0c;其名称来源于“cat”的反向拼写。tac命令的基本功能是将文件的内容从最后一行开始输出&#xff0c;直到第一行结束&#xff0c;这与cat命令的功能相反&#xff0c;cat命令是从第一行开始输出直到最后一行。 tac…

vite乾坤 vite-plugin-qiankun 报错 ReferenceError: ReadableStream is not defined

今天新接入一个子应用&#xff0c;发现其他子项目都可以运行&#xff0c;改造代码都差不多。我新的项目却报错 ReferenceError: ReadableStream is not defined断点发现是有个库版本不对&#xff0c;上github搜到了问题。 https://github.com/tengmaoqing/vite-plugin-qiankun…

ELK之路第四步——整合!打通任督二脉

ELK之路第四步——整合&#xff01;打通任督二脉 前言1.架构2.下载资源3.整合开始1.分别启动三个es2.启动kibana3.新建filebeat_logstash.yml配置文件4.修改logstash的启动配置文件5.启动logstash6.启动filebeat7.Kibana查看 4.结语 前言 在开始本篇之前&#xff0c;你需要用到…

[JAVAEE] 多线程的案例(四) - 定时器

目录 一. 什么是定时器? 二. java中的定时器类 三. 定时器的简单使用. 四. 模拟实现定时器 4.1 实现 MyTimerTask 4.2 实现 MyTimer 一. 什么是定时器? 定时器相当于闹钟, 时间到了就执行一些逻辑. 二. java中的定时器类 使用Timer类实例化一个定时器对象. Timer类中的…

C++调试经验:Ubuntu下Qt工程链接常见库的方式(持续更新)

目录 1. Qt工程链接OpenCV库 2. Qt工程链接tinyxml库 3. Qt工程链接pugixml库 4. Qt工程链接geographiclib地理信息转换库 5. Qt工程链接gstreamer音视频流媒体处理库 6. Qt工程链接VTK三维可视化库 7. Qt工程链接PCL点云处理库 8. Qt工程链接json-cpp库 9. Qt工程链…

Vue学习笔记(十一)

一. Promise 1. 异步 异步&#xff1a;则是将耗时很长的A交付的工作交给系统之后&#xff0c;就去继续做B交付的工作&#xff0c;等到系统完成了前面的工作之后&#xff0c;再通过回调或者事件&#xff0c;继续做A剩下的工作。AB工作的完成顺序&#xff0c;和交付他们的时间顺…

江协科技STM32学习- P21 ADC模数转换器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

OpenAI放弃自制AI芯片!伦敦场开发者日Hugging Face工程师现场“拷问”Sam Altman

OpenAI 2024年开发者大会第二场&#xff08;伦敦场&#xff09;刚结束。 10月初在旧金山举办了第一场 OpenAI 开发者大会&#xff0c;但这次没有像上一场放出很多花活&#xff0c;这次开始走剧透局了&#xff01; 现场的OpenAI 产品主管 曝光了 GPT o1即将更新的功能&#xf…

浅谈网络安全

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 网络安全是确保信息系统、网络及数据免受未授权访问、使用、披露、篡改或破坏的重要领域。随着数字化进程的加速和互联网的普及&#xff0c;网络安全的重要性显著提升。今天&#xff0c;网络威胁呈现出多样化…