Java-数据结构-并查集<二>
一.并查集的简单介绍
二. 并查集的主要构成和实现方式
三.HashMap模板和数组模板
由于在下文的模板基本一致,不再每次都罗列,大体的模板如下,若有错误可以在leetcode找到对应的题目解答,已经附上连接。
HashMap
class UnionFind {private Map<Integer,Integer> father;public UnionFind() {father = new HashMap<Integer,Integer>();}public void add(int x) {if (!father.containsKey(x)) {father.put(x, null);}}public void merge(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX != rootY){father.put(rootX,rootY);}}public int find(int x) {int root = x;while(father.get(root) != null){root = father.get(root);}while(x != root){int original_father = father.get(x);father.put(x,root);x = original_father;}return root;}public boolean isConnected(int x, int y) {return find(x) == find(y);}
}
数组
class UnionFind{public int[] parent;public int count;//初始化public UnionFind(int n){parent = new int[n];count = n;for(int i = 0; i< n; i++){parent[i] = i;}}//查找public int find(int x){while(x != parent[x]){parent[x] = parent[parent[x]];x = parent[x];}return x;}//合并节点public void union(int x, int y){if(find(x) == find(y)) return;parent[find(x)] = find(y);count--;}//是否为同一父节点,也就是是否联通public boolean isConnected(int x, int y){return find(x) == find(y);}//返回数量public int getCount(){return count;}
}
三. leetcode实战
1. leetcode547 省份数量
2. leetcode684 冗余连接
以上未出现部分圈全在在前篇文章,不再赘述
Java-数据结构-并查集<一>
3. leetcode1905 统计子岛屿
给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地)。一个 岛屿 是由 四个方向 (水平或者竖直)上相邻的 1 组成的区域。任何矩阵以外的区域都视为水域。
如果 grid2 的一个岛屿,被 grid1 的一个岛屿 完全 包含,也就是说 grid2 中该岛屿的每一个格子都被 grid1 中同一个岛屿完全包含,那么我们称 grid2 中的这个岛屿为 子岛屿 。
请你返回 grid2 中 子岛屿 的 数目 。
输入:grid1 = [[1,1,1,0,0],[0,1,1,1,1],[0,0,0,0,0],[1,0,0,0,0],[1,1,0,1,1]], grid2 = [[1,1,1,0,0],[0,0,1,1,1],[0,1,0,0,0],[1,0,1,1,0],[0,1,0,1,0]]
输出:3
解释:如上图所示,左边为 grid1 ,右边为 grid2 。
grid2 中标红的 1 区域是子岛屿,总共有 3 个子岛屿。

整体思路:
1.遍历grid2数组,利用并查集把区域都连通起来
2.将grid的根节点都添加到HashSet中
3.到grid1中找HashSet中对应的节点是不是1
以示例一为例

那么,在使用并查集后,我们的un2里面陆地联通的区域就是:
0,11,15,17,21
那么对应的HashSet里面也会是{0,11,15,17,21}
然后遍历grid1,找到HashSet对应的位置,是1的话,就可以符合题目要求。
HashSet中的11是不符合要求的,因为对应的grid1里面是0,同样
HashSet中的17也是同样的道理。
主题函数部分(模板在上方)
class Solution {public int countSubIslands(int[][] grid1, int[][] grid2) {int row1 = grid1.length;int col1 = grid1[0].length;int row2 = grid2.length;int col2 = grid2[0].length;UnionFind un2 = new UnionFind(row2*col2);//遍历grid2for(int i = 0; i < row2; i++){for(int j = 0; j < col2; j++){if(grid2[i][j] == 0) continue;if(i+1 < row2 && grid2[i+1][j] == 1) un2.union(i*col2+j, i*col2+j+col2);if(j+1 < col2 && grid2[i][j+1] == 1) un2.union(i*col2+j, i*col2+j+1);}}//把grid2联通区域的根节点放进set中HashSet<Integer> set = new HashSet<>();for(int i = 0; i < row2; i++){for(int j = 0; j < col2; j++){if(grid2[i][j] == 1){set.add(un2.find(i*col2+j));} }}//去grid1查找对应的点是不是1for(int i = 0; i < row1; i++){for(int j = 0; j < col1; j++){if(grid1[i][j] == 0){set.remove(un2.find(i*col2+j));} }}return set.size();}
}
原题解连接(若模板有出入可参考):
Java 并查集 超简单易懂附模板
4. leetcode1254 统计封闭岛屿的数目
二维矩阵 grid 由 0 (土地)和 1 (水)组成。岛是由最大的4个方向连通的 0 组成的群,封闭岛是一个 完全 由1包围(左、上、右、下)的岛。
请返回 封闭岛屿 的数目。
示例 1:
输入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]
输出:2
解释:
灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。

整体思路
1. 用并查集走一遍grid,把岛屿都联通起来
2. 用HashSet添加岛屿的根节点
3. 把处于边上,也就是下图中红色部分排除掉(注意,此时排除的是对应是陆地的那个节点的根节点)

也就是
if(grid[i][j] == 0){if(i == 0 || j == 0 || i == row-1 || j == col -1) set.remove(un.find(i*col+j));
}
主函数中
if(i == 0 || j == 0 || i == row-1 || j == col -1)
可以排除掉图中红色的部分。
主函数部分
class Solution {public int closedIsland(int[][] grid) {int row = grid.length;int col = grid[0].length;UnionFind un = new UnionFind(row*col);for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(grid[i][j] == 1) continue;if(i+1 < row && grid[i+1][j] == 0) un.union(i*col+j, i*col+j+col);if(j+1 < col && grid[i][j+1] == 0) un.union(i*col+j, i*col+j+1);}}HashSet<Integer> set = new HashSet<>();for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(grid[i][j] == 0) set.add(un.find(i*col+j)); }}for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(grid[i][j] == 0){if(i == 0 || j == 0 || i == row-1 || j == col -1) set.remove(un.find(i*col+j)); }}}return set.size();}
}
原题解连接(若模板有出入可参考):
Java 并查集 思路简单附模板
5. leetcode130 被围绕的区域
给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。
示例 1:
输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。
任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。
如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

整体思路:
1.这题和1254. 统计封闭岛屿的数目思路一样
2.只不过要的是外面的岛屿,而1254里要的是里卖的。
思路
1. 并查集走一遍,得到所有的父节点
2. 把所有的父节点添加到set中
3. 把边上的所有的岛排除掉(即排除边上的是'O'的父节点)(即下图红色的部分从set中排除)
4. 把剩在set中的父节点中的是'O'的都变成'X'

主函数
class Solution {public void solve(char[][] board) {int row = board.length;int col = board[0].length;UnionFind un = new UnionFind(row*col);for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(board[i][j] == 'X') continue;if(i+1 < row && board[i+1][j] == 'O') un.union(i*col+j, i*col+j+col);if(j+1 < col && board[i][j+1] == 'O') un.union(i*col+j, i*col+j+1);}}HashSet<Integer> set = new HashSet<>();for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(board[i][j] == 'O'){set.add(un.find(i*col +j));}}}for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(board[i][j] == 'O'){if(i == 0 || j == 0 || i == row-1 || j == col-1){set.remove(un.find(i*col +j));}}}}for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(board[i][j] == 'O'){if(set.contains(un.find(i*col +j))){board[i][j] = 'X';}}}}}
}
原题解连接(若模板有出入可参考):
Java 并查集 思路简单附模板
6. leetcode1319 连通网络的操作次数
用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。
网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。
给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。
输入:n = 4, connections = [[0,1],[0,2],[1,2]]
输出:1
解释:拔下计算机 1 和 2 之间的线缆,并将它插到计算机 1 和 3 上。

思路:
1. 我们总共有的线的数量就是connections数组的数量
2. 连接n个电脑我们最少需要n-1条线
3. 并查集过后我们把已经连接的电脑看作一个整体m,如果线够用的情况下我们只需要m-1条线,不必在意具体要怎么连接
以示例2为例
示例 2:
输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2],[1,3]]
输出:2

那么在并查集过后,并查集的数量是3,减一就可以得到我们需要的答案。
主函数
class Solution {public int makeConnected(int n, int[][] connections) {int len = connections.length;if(len < n-1) return -1;UnionFind un = new UnionFind(n);for(int i = 0; i < len; i++){un.union(connections[i][0],connections[i][1]);}return un.getcount()-1;}
}
原题解连接(若模板有出入可参考):
Java 并查集 简单易懂附模板
相关文章:
Java-数据结构-并查集<二>
一.并查集的简单介绍 二. 并查集的主要构成和实现方式 三.HashMap模板和数组模板 由于在下文的模板基本一致,不再每次都罗列,大体的模板如下,若有错误可以在leetcode找到对应的题目解答,已经附上连接。 HashMap class UnionFi…...
JSP网上教学资源共享系统(源代码+论文)
通过网上教学资源共享系统的建设,完成了对于操作系统课程的远程化授课。可以使学生不受时间空间的限制,通过网络对于这门课程进行学习。建立起了基于B/C的网络化教学系统。本网站采用当前最流行的JSP网络编程技术,可以实现数据的高效、动态、…...
QT C++入门学习(1) QT Creator安装和使用
Qt官方下载 Qt 官网有一个专门的资源下载网站,所有的开发环境和相关工具都可以从这里下载,具体地址是:http://download.qt.io/ 进入链接后,是一个文件目录,依次进入这个路径:archive/qt/5.12/5.12.9/qt-o…...
UE动画状态机的事件触发顺序测试
正常A状态过渡到B状态的事件顺序: 整个流程为: 调用B状态的On Become Relevant事件调用B状态的On Update事件调用A状态的Left State Event事件调用B状态的Entered State Event事件调用B状态的Start Transition Event事件调用B状态的End Transition Even…...
数学建模的搜索技巧
你真的会使用“度娘”吗?是不是在查找所需要的东西的时候,搜出来的信息价值并不是很大,跟着北海老师学习,如何更高效的使用百度去查询自己想要的,有用的资料! 搜索技巧 完全匹配搜索 : 查询词的外边加上双…...
学成在线笔记+踩坑(10)——课程搜索、课程发布时同步索引库。
导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题_java黑马笔记 目录 1 【检索模块】需求分析 1.1 全文检索介绍 1.2 业务流程 1.2.1、课程发布时索引库里新增一条记录 1.2.2、课程搜索 2 准…...
某应用虚拟化系统远程代码执行
漏洞简介 微步在线漏洞团队通过“X漏洞奖励计划”获取到瑞友天翼应用虚拟化系统远程代码执行漏洞情报(0day),攻击者可以通过该漏洞执行任意代码,导致系统被攻击与控制。瑞友天翼应用虚拟化系统是基于服务器计算架构的应用虚拟化平台,它将用户…...
solaris-Oracle11g于linux-mysql相连
Oracle11g(solaris64sparc)mysql(linux)实验 此实验目的,实现公司ebs R12 连mysql上的短信平台.预警和提示ebs中信息, 一,环境 主机名 ip 平台 数据库 dbname ebs234 192.168.1.234 …...
大厂齐出海:字节忙种草,网易爱社交
配图来自Canva可画 随着国内移动互联网红利逐渐触顶,互联网市场日趋饱和,国内各互联网企业之间的竞争便愈发激烈起来。在此背景下,广阔的海外市场就成为了腾讯、阿里、字节、京东、拼多多、百度、网易、快手、B站等互联网公司关注和争夺的重…...
几个实用的正则表达式
1到100之间的正整数正则 表达式:^[1-9]\d?$|^100$ 解释: ^表示匹配字符串开始位置 [1-9]表示数字1-9中的任意一个 \d表示任意一个数字 ?表示前面一个字符或子表达式出现0或1次 $表示匹配字符串结束位置 |表示或 最终的解释为:匹配满…...
python实战应用讲解-【numpy数组篇】常用函数(八)(附python示例代码)
目录 Python Numpy MaskedArray.cumprod()函数 Python Numpy MaskedArray.cumsum()函数 Python Numpy MaskedArray.default_fill_value()函数 Python Numpy MaskedArray.flatten()函数 Python Numpy MaskedArray.masked_equal()函数 Python Numpy MaskedArray.cumprod()函…...
Speech and Language Processing-之N-gram语言模型
正如一句老话所说,预测是困难的,尤其是预测未来。但是,如何预测一些看起来容易得多的事情,比如某人接下来要说的几句话后面可能跟着哪个单词。 希望你们大多数人都能总结出一个很可能的词是in,或者可能是over&#x…...
【AI】Python 安装时启用长路径支持
文章目录 场景:解释:关于文件长路径:计算方法: 场景: Python 安装时,会出现 Disable path length limit 的提示。 解释: 在 Windows 操作系统中,文件路径的长度是有限制的。在早期…...
深入理解Go语言中的接口编程【17】
文章目录 接口接口接口类型为什么要使用接口接口的定义实现接口的条件接口类型变量值接收者和指针接收者实现接口的区别值接收者实现接口指针接收者实现接口下面的代码是一个比较好的面试题 类型与接口的关系一个类型实现多个接口多个类型实现同一接口接口嵌套 空接口空接口的定…...
“数字中国·福启海丝”多屏互动光影艺术秀27日在福州举办
作为深化“数字海丝”的核心区、海上丝绸之路的枢纽城市,为喜迎第六届数字中国建设峰会盛大召开之际,福州市人民政府特此举办“数字中国福启海丝”多屏互动光影秀活动。本次光影秀活动是由福建省文化和旅游厅指导,福州市人民政府主办…...
Docker安装mysql8.0文档
第一步需要安装Docker基础环境,具体可以看看这篇 docker基础篇 第二步,拉取mysql8.0的镜像 docker pull mysql:8.0 第三步,镜像启动和文件挂载 复制下面命令执行,33006是对外访问暴露的端口,当然你也可以设置为3306…...
在函数中使用变量
shell脚本编程系列 向函数传递参数 函数可以使用标准的位置变量来表示在命令行中传给函数的任何参数。其中函数名保存在$0变量中,函数参数则依次保存在$1、$2等变量当中,也可以使用特殊变量$#来确定参数的个数 在脚本中调用函数时,必须将参…...
python算法中的深度学习算法之自编码器(详解)
目录 学习目标: 学习内容: 自编码器 Ⅰ. 编码器(Encoder) Ⅱ. 解码器(Decoder)...
Python入门(一)Python概述与环境搭建
Python概述与环境搭建 1.概述1.1版本及下载1.2 Python 特点 2.环境搭建3.第一个程序“hello,world”4.可能会存在的问题 1.概述 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言…...
02_Lock锁
首先看一下JUC的重磅武器——锁(Lock) 相比同步锁,JUC包中的Lock锁的功能更加强大,它提供了各种各样的锁(公平锁,非公平锁,共享锁,独占锁……),所以使用起来…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...
