并查集(Java实现)

news/2024/11/8 18:29:11/

基本实现

任务:

  维护多个不相交的集合,支持两种操作:合并两个集合,查询一个元素所在的集合。

说明:

  维护一个森林,每一棵树都代表一个集合,树根元素为这个集合的代表元。利用数组father[]查询记录每个元素的父亲节点。

查询一个元素所处集合时,只需不断寻找父节点,即可找到该元素所处集合的代表元。

合并两个集合时,先找到两个集合代表元x,y,然后令father[x]=y即可。

优化:

  路径压缩,沿着树根的路径找到元素a所在集合代表元b后,对这条路径上的所有元素x,令father[a]=b;

  按rank启发式合并,对于每个集合维护一个rank值,每次将rank较小的集合合并到rank较大的集合,合并两个相同的集合时rank=rank+1。

  根据不同情况也可以添加集合大小等属性。


public class union_find {private int[] father;private int[] rank;//初始化public union_find(int n) {father = new int[n];rank = new int[n];for (int i = 0; i < n; i++) {father[i] = i;rank[i] = 1;}}//查询在那个集合int find(int v) {return father[v] = father[v] == v ? v : find(father[v]);}//合并void merge(int x, int y) {int a = find(x);int b = find(y);if (rank[a] < rank[b]) {father[a] = b;} else {father[b] = a;if (rank[a] == rank[b]) {rank[a]++;}}}}

例题

省份数量icon-default.png?t=MBR7https://leetcode.cn/problems/number-of-provinces/description/代码:

class Solution {public int findCircleNum(int[][] isConnected) {if(isConnected==null||isConnected.length == 0){return 0;}int n=isConnected.length;union_find uf=new union_find(n);for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if(isConnected[i][j]==1){uf.merge(i,j);}}}int cnt=0;for (int i = 0; i < n; i++) {if(uf.father[i]==i){cnt++;}}return cnt;}public class union_find {private int[] father;private int[] rank;//初始化public union_find(int n) {father = new int[n];rank = new int[n];for (int i = 0; i < n; i++) {father[i] = i;rank[i] = 1;}}//查询在那个集合int find(int v) {return father[v] = father[v] == v ? v : find(father[v]);}//合并void merge(int x, int y) {int a = find(x);int b = find(y);if (rank[a] < rank[b]) {father[a] = b;} else {father[b] = a;if (rank[a] == rank[b]) {rank[a]++;}}}}}

 

剑指 Offer II 119. 最长连续序列icon-default.png?t=MBR7https://leetcode.cn/problems/WhsWhI/description/

代码:

import java.util.HashMap;class Solution {public int longestConsecutive(int[] nums) {//存储下标和值Map<Integer,Integer>map=new HashMap<>();union_find uf=new union_find(nums.length);for (int i = 0; i < nums.length; i++) {if(map.containsKey(nums[i]))continue;if(map.containsKey(nums[i]-1)){uf.merge(i,map.get(nums[i]-1));}if(map.containsKey(nums[i]+1)){uf.merge(i,map.get(nums[i] + 1));}map.put(nums[i], i);}int size=0;for (int i = 0; i < nums.length; i++) {if(uf.father[i]==i){size=Math.max(size,uf.size[i]);}}return size;}public class union_find {private int[] father;private int[] size;//初始化public union_find(int n) {father = new int[n];size= new int[n];for (int i = 0; i < n; i++) {father[i] = i;size[i] = 1;}}//查询在那个集合int find(int v) {return father[v] = father[v] == v ? v : find(father[v]);}//合并void merge(int x, int y) {int a = find(x);int b = find(y);if(a==b)return;father[a]=b;size[b]+=size[a];}}
}


http://www.ppmy.cn/news/18462.html

相关文章

逆卷积(ConvTranspose2d)是什么?

上图是一个卷积操作&#xff08;蓝色为输入&#xff0c;绿色为输出&#xff09;。 输入的特征图为x&#xff1a;( 4&#xff0c;4 &#xff0c;channels_in&#xff09;其中channels_in表示通道数。 卷积核设置&#xff1a;无padding&#xff0c; kernel size为3*3&#xff0c…

为什么STM32设置Flash地址0x08000000而不是0x00000000?STM32的启动过程

STM32F103ZE芯片存储空间的地址映射关系图。 在MDK编译程序设置ROM和RAM地址时候发现&#xff1a;    IROM1为片上程序存储器&#xff0c;即片上集成的Flash存储器&#xff0c;对该处理器Flash大小为512KB&#xff0c;即0x80000 地址区间为0x8000000~0x0807FFFF  IRAM1为片…

员工入职管理系统|员工管理系统|基于SpringBoot+Vue的企业新员工入职系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

Java设计模式-迭代器模式、迭代器模式是什么、怎么使用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.9 迭代器者模式 6.9.1 定义 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示 6.9.2 结构 抽象聚合(Aggregate)角色&a…

yolo v8 解决了 v5 的问题嘛?

文章大纲 yolo v8 简介网络结构yolo v8 准确率的提升yolo v8 的速度提升参考文献与学习路径yolo v8 简介 官网: https://ultralytics.com/yolov8https://github.com/triple-Mu/YOLOv8-TensorRT详细介绍: https://learnopencv.com/ultralytics-yolov8/网络结构 yolo v8 准确率…

数字逻辑理论——组合电路

利用数据选择器设计组合逻辑电路 m&#xff1a;组合电路输入变量个数 n&#xff1a;数据选择器的控制端个数 &#xff08;1&#xff09;mn 利用8选1数据选择器设计函数&#xff1a;FAB’A’CBC’ 待设计卡诺图&#xff1a; F∑(1,2,3,4,5,6) &#xff08;2&#xff09;m&g…

【手写 Vue2.x 源码】第三十四篇 - 组件部分-Vue组件与初始化流程简介

一&#xff0c;前言 上篇&#xff0c;进行了diff算法阶段性梳理&#xff0c;主要涉及以下几个点&#xff1a; 初渲染与视图更新流程&#xff1b;diff 算法的外层更新&#xff1b;diff 算法的比对优化&#xff1b;diff 算法的乱序比对&#xff1b;初渲染和更新渲染判断&#x…

概论_第6章_统计量及其抽样分布_知识结构

先看知识结构图数理统计的特点是 背记的内容多&#xff0c; 与前面概率论 背记和计算的多 有很大区别。本文从统计量的概念讲起, 一. 统计量定义&#xff1a; 设 ...... 为取自某总体的样本&#xff0c; 若样本函数TT(, ... ) 中不含有任何未知参数&#xff0c; 则称T 为统计…