并查集练习—省份数量

上一篇中讲了并查集及其原理,在这篇文章中简单应用一下。如果对并查集不是很了解强烈建议先看上一篇。

题目:
有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。如果isConnected[i][j] = 1,则isConnected[j][i] = 1。

返回矩阵中 省份 的数量。

举例:
根据题目中最后一段所说,给定的n * n矩阵中,如果城市 i 和城市 j相连,则isConnected[i][j] = 1。
如果可以理解为一个2维数组中的行和列,是每个城市之间的连接关系。
在这里插入图片描述
如果所示,i为行数,j为列数。城市A和A本身之间默认是相连的为1,城市A与城市B相连,也为1,A与B相连,B也必定与A相连,所示BA也为1,城市AB之间构成了一大片的省份。城市C与AB都不相连,只有自己,所以CC为1,其余为0,此时图示中省份数为2。
在这里插入图片描述
如果ABC之间互不相连,则省份数量为3。
在这里插入图片描述
分析:
在这里插入图片描述

  1. 因为isConnected[i][j] = 1,则isConnected[j][i] = 1并且isConnected[i][i] = 1,所以矩阵一定是对称的。所以只需要遍历上半部分就可以(以从左上到右下的对角线为分界)。
  2. 以上图为例,AC相连,所以域中有{A,C},CA与AC域相同,不用管,B与其他两个不相连,单独为域{B},所以共两个省份{A,C},{B}。
  3. 将每个城市看做是一个样本,每个样本是一个独立的集合,如果isConnected[i][i] = 1,则进行合并。合并完后,看一共有几个集合。

实现方式与上一篇中介绍的HashMap方式有所不同,采用数组的形式,常数时间会照比Map更好一些(数组寻址比栈的压栈弹栈快)。

代码实现:

public static int findCircleNum(int[][] M) {int N = M.length;UnionFind unionFind = new UnionFind(N);for (int i = 0; i < N; i++) {for (int j = i + 1; j < N; j++) {if (M[i][j] == 1) {unionFind.union(i, j);}}}return unionFind.sets;}public static class UnionFind {//i位置的parent是parent[i]private int[] parent;//i所在集合大小为size[i]//size[i]是代表节点才有意义,否则无意义private int[] size;//容器,帮助使结构扁平化private int[] help;//集合个数private int sets;public UnionFind(int N) {parent = new int[N];size = new int[N];help = new int[N];sets = N;for (int i = 0; i < N; i++) {parent[i] = i;size[i] = 1;}}//从index开始,找到代表节点,并进行路径压缩public int findParent(int index) {int num = 0;while (index != parent[index]) {help[num++] = index;index = parent[index];}for (int i = 0; i < num; i++) {help[i] = parent[index];}return index;}public boolean isSameSet(int i, int j) {return findParent(i) == findParent(j);}public void union(int i, int j) {int iParent = findParent(i);int jParent = findParent(j);if (iParent != jParent) {if (size[i] >= size[j]){size[i] += size[j];parent[jParent] = iParent;}else{size[j] += size[i];parent[iParent] = jParent;}sets--;}}}

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

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

相关文章

Python 开发工具 Pycharm —— 使用技巧Lv.2

pydoc是python自带的一个文档生成工具&#xff0c;使用pydoc可以很方便的查看类和方法结构 本文主要介绍&#xff1a;1.查看文档的方法、2.html文档说明、3.注释方法、 一、查看文档的方法 **方法1&#xff1a;**启动本地服务&#xff0c;在web上查看文档 命令【python3 -m…

云上 Index:看「简墨」如何为云原生打造全新索引

拓数派首款数据计算引擎 PieCloudDB Database 是一款全新的云原生虚拟数仓。为了提升用户使用体验&#xff0c;提高查询效率&#xff0c;在实现存算分离的同时&#xff0c;PieCloudDB 设计与打造了全新的存储引擎「简墨」等模块&#xff0c;并针对云场景和分析型场景设计了高效…

基于Yolov2深度学习网络的车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. 卷积神经网络&#xff08;CNN&#xff09; 4.2. YOLOv2 网络 4.3. 实现过程 4.4. 应用领域 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心…

图论-简明导读

计算机图论是计算机科学中的一个重要分支&#xff0c;它主要研究图的性质和结构&#xff0c;以及如何在计算机上有效地存储、处理和操作这些图。本文将总结计算机图论的核心知识点。 一、基本概念 计算机图论中的基本概念包括图、节点、边等。图是由节点和边构成的数据结构&am…

新版chrome浏览器恢复下载的时候恢复底栏提示

近日&#xff0c;谷歌对其Chrome浏览器进行了更新&#xff0c;为所有桌面系统的Chrome浏览器增加了位于地址栏右侧的“下载”气泡&#xff0c;并同时取消了原有的底部下载栏。 谷歌表示&#xff0c;这次更新的目的是为了让用户更方便地与最近下载的文件进行交互。 然而&#x…

Kubernetes v1.20 二进制部署

架构 k8s集群master01&#xff1a;192.168.80.101 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;192.168.80.102 k8s集群node01&#xff1a;192.168.80.103 kubelet kube-proxy docker k8s集群node02&#xff1a;192.168.80…

windows永久暂停更新

目录 1.winr,输入regedit打开注册表 2.打开注册表的这个路径: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键空白地方新建QWORD值命名为:FlightSettingsMaxPauseDays 3.双击FlightSettingsMaxPauseDays,修改里面的值为100000,右边基数设置…

Python求均值、方差、标准偏差SD、相对标准偏差RSD

均值 均值是统计学中最常用的统计量&#xff0c;用来表明资料中各观测值相对集中较多的中心位置。用于反映现象总体的一般水平&#xff0c;或分布的集中趋势。 import numpy as npa [2, 4, 6, 8]print(np.mean(a)) # 均值 print(np.average(a, weights[1, 2, 1, 1])) # 带…

小白也能懂!业务中台与数据中台究竟是什么?

大家好&#xff0c;今天我们要讨论的是业务中台与数据中台&#xff0c;或许你对这些名词还不太熟悉&#xff0c;但别担心&#xff0c;接下来我将为你详细解释这两个概念&#xff0c;并且用通俗易懂的语言来解释它们。 业务中台是什么&#xff1f; 首先&#xff0c;让我们来了解…

打开的idea项目maven不生效

方法一&#xff1a;CtrlshiftA&#xff08;或者help---->find action&#xff09;&#xff0c; 输入maven&#xff0c; 点击add maven projects&#xff0c;选择本项目中的pom.xml配置文件&#xff0c;等待加载........ 方法二&#xff1a;view->tools windows->mave…

第5章 通过微信网页授权间接获取微信中的code值

1 准备基于外网的有效回调页面 由于当前最新版的微信不再显示带有code值的错误页面&#xff0c;所以开发者必须先自己构建1个用于获取code值外网的有效回调页面&#xff0c;微信浏览器才能通过该有效回调页面获取code值。 上面的页面在最新版的微信不再显示。 1.1 构建基于外网…

Nginx使用proxy_cache指令设置反向代理缓存静态资源

场景 CentOS7中解压tar包的方式安装Nginx&#xff1a; CentOS7中解压tar包的方式安装Nginx_centos7 tar文件 怎么load_霸道流氓气质的博客-CSDN博客 参考上面流程实现搭建Nginx的基础上&#xff0c;实现静态资源的缓存设置。 注意上面安装时的目录是在/opt/nginx目录下&…