算法刷题打卡第29天:省份数量---并查集

news2024/12/23 8:17:34

省份数量

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

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

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

返回矩阵中省份的数量。

示例 1:

在这里插入图片描述

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2

示例 2:
在这里插入图片描述

输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3

并查集

思路:
计算连通分量数的另一个方法是使用并查集。初始时,每个城市都属于不同的连通分量。遍历矩阵 i s C o n n e c t e d isConnected isConnected,如果两个城市之间有相连关系,则它们属于同一个连通分量,对它们进行合并。
遍历矩阵 i s C o n n e c t e d isConnected isConnected 的全部元素之后,计算连通分量的总数,即为省份的总数。

时间复杂度: O ( n 2 l o g n ) O(n^2 log n) O(n2logn),其中 n n n 是城市的数量。需要遍历矩阵 i s C o n n e c t e d isConnected isConnected 中的所有元素,时间复杂度是 O ( n 2 ) O(n^2) O(n2),如果遇到相连关系,则需要进行 2 次查找和最多 1 次合并,一共需要进行 2 n 2 2n^2 2n2 次查找和最多 n 2 n^2 n2 次合并,因此总时间复杂度是 O ( 2 n 2 log ⁡ n 2 ) = O ( n 2 log ⁡ n ) O(2n^2 \log n^2)=O(n^2 \log n) O(2n2logn2)=O(n2logn)。这里的并查集使用了路径压缩,但是没有使用按秩合并,最坏情况下的时间复杂度是 O ( n 2 log ⁡ n ) O(n^2 \log n) O(n2logn),平均情况下的时间复杂度依然是 O ( n 2 α ( n ) ) O(n^2 \alpha (n)) O(n2α(n)),其中 α \alpha α 为阿克曼函数的反函数, α ( n ) \alpha(n) α(n)可以认为是一个很小的常数。
空间复杂度: O ( n ) O(n) O(n),其中 n n n 是城市的数量。需要使用数组 r o o t s roots roots记录每个城市所属的连通分量的祖先。

class Solution:
    def findCircleNum(self, isConnected):
        def find(index):
            if roots[index] != index:
                roots[index] = find(roots[index])
            return roots[index]
        def merge(index1, index2):
            roota = find(index1)
            rootb = find(index2)
            if roota == rootb:
                return
            if deep[roota] > deep[rootb]:
                roots[rootb] = roota
            elif deep[roota] < deep[rootb]:
                roots[roota] = rootb
            else:
                roots[roota] = rootb
                rootb += 1
        cities = len(isConnected)
        deep = [1] * cities
        roots = list(range(cities))
        for i in range(cities):
            for j in range(i+1, cities):
                if isConnected[i][j] == 1:
                    merge(i, j)

        return sum(roots[i]==i for i in range(cities))

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-provinces

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

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

相关文章

SQL注入漏洞 | iwebsec

文章目录靶场搭建SQL注入漏洞靶场搭建 配置 云服务器&#xff1a;阿里云 系统&#xff1a;CentOS 7.6 靶场&#xff1a;iwebsec CentOS-7.6安装docker 安装iwebsec 启动靶场 docker run --restartalways --name iwebsec -it -dp 8001:80 iwebsec/iwebsec访问不成功 可能是…

希望流程挖掘成为撬动企服市场的突破口 | 专访凡得科技CEO海广跃、首席技术顾问刘聪

2022年&#xff0c;全球流程挖掘市场规模预计将达70多亿人民币&#xff0c;而目前中国流程挖掘行业尚处于市场启蒙期&#xff0c;仅少数大型企业与机构对流程挖掘进行了初步或尝试性的投入。从目前来看&#xff0c;原生流程挖掘厂商会直接面向客户输出流程挖掘能力&#xff0c;…

Spring集合注入

一、环境准备 创建一个Maven项目pom.xml添加Spring依赖resources下添加spring的配置文件applicationContext.xml项目中添加BookDao、BookDaoImpl类 public interface BookDao {public void save(); }public class BookDaoImpl implements BookDao {private int[] array;priva…

容器云平台初始化(harbor的安装部署)

1.虚拟机规划 设备说明主机名接口IP地址虚拟机1MasterEth010.0.0.10/24虚拟机2Node1Eth010.0.0.20/24虚拟机3HarborEth010.0.0.30/24 2.容器云平台初始化(harbor的安装部署) 1.根据规划的IP地址&#xff0c;创建虚拟机&#xff0c;确保网络正常通信。按照规划表修改主机名并关…

Linux-ACL权限

ACL权限简介 ACL&#xff1a;access control list 允许给任何用户或者用户组设置任何文件或者目录的访问权限 查看Linux是否开启ACL dumpe2fs Linux一般都开启了ACL权限&#xff0c;可以使用下面的命令查看分区的ACL权限是否打开 首先可以使用df -h或者lsblk来查看Linux系统…

JioNLP上的那些好用的冷门工具

大家好&#xff0c;JioNLP(https://github.com/dongrixinyu/JioNLP)目前已经在Github上有了1600星的点赞&#xff0c;下载安装量大概有几万了。 被使用最多的功能&#xff0c;也是被问得最多的&#xff0c;主要是关键短语抽取、时间语义解析、地址按省市县三级解析等等。其它功…

程序员迷茫:30岁以上的“大龄程码农”出路在哪?java码农该怎么办?

程序员生存、成功、制胜的法则源自IT精英的职业发展秘诀热爱工作&#xff0c;享受生活 为什么程序员过了30就不行了&#xff1f; 我们被固定在“敲代码”的坑里&#xff0c;一干就是10年&#xff0c;再干别的早已不会。敲代码已经成了一项流水线般的工作&#xff0c;就像搬砖工…

Postman非GUI运行脚本工具Newman的安装简介

一、Newman简介 Newman是为Postman而生&#xff0c; 专门用来运行Postman编写好的脚本&#xff1b;使用Newman&#xff0c; 你可以很方便的用命令行来执行postman collections 二、Newman安装 1.先下载Node.js https://nodejs.org/zh-cn/download/ 根据自己电脑系统及位数…

数字验证学习笔记——SystemVerilog芯片验证12 ——句柄的使用包的使用

一、句柄的使用 句柄可以作为形式参数通过方法来完成对象指针的传递&#xff0c;从外部传入方法内部。 句柄也可以在方法内部首先完成修改&#xff0c;而后再由外部完成使用 最后会报错&#xff0c;因为create&#xff08;t&#xff09;定义的是function&#xff0c;没有返回…

锁机制之 Condition 接口

1. 前言 本节内容主要是对 Java 锁机制之 Condition 接口进行讲解&#xff0c;Condition 接口是配合 Lock 接口使用的&#xff0c;我们已经学习过 Lock 接口的相关知识&#xff0c;那么接下来对 Condition 接口进行讲解。本节内容的知识点如下&#xff1a; 2. Condition 接口…

cookie、localStorage 和sessionStorage

文章目录Cookie1.什么是 Cookie&#xff1f;2.cookie的工作机制&#xff0c;运作流程cookie属性项3.读取cookie4.修改cookie5.删除cookielocalStorage 和sessionStorage1.生存期2.数据结构3.API 不管是 localStorage&#xff0c;还是 sessionStorage&#xff0c;可使用的API都相…

基于FPGA+MPU+MCU全自动血细胞分析仪解决方案

全自动血细胞分析仪是医院临床检验应用非常广泛的仪器之一&#xff0c;用来检测红细胞、血红蛋白、白细胞、血小板等项目。是基于电子技术和自动化技术的全自动智能设备&#xff0c;功能齐全&#xff0c;操作简单&#xff0c;依托相关计算机系统在数据处理和数据分析等方面具有…

蓝牙学习三(GAP)

1.简介 GAP&#xff08;Generic Access Profile-通用访问配置文件&#xff09;与应用层紧密相连&#xff0c;所以要想了解BLE&#xff0c;GAP是必须认识的东西。 在第一章中我们说过GAP层&#xff0c;GAP层目前主要用来进行广播、扫描和发起连接。GAP保证了不同的BLE设备可以互…

深度学习入门(7)误差反向传播计算方式及简单计算层的实现

在上一节中《深度学习入门&#xff08;6&#xff09;误差反向传播基础---计算图与链式法则》&#xff0c;我们介绍了误差反向传播的计算图与导数计算的链式法则&#xff0c;这一节主要介绍计算图中各计算节点的误差反向传播计算方式&#xff0c;以及加法与乘法层的实现。 目录…

Scala系列-4、scala中特质、柯里化、闭包等

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 传送门&#xff1a;大数据系列文章目录 目录scala中特质特质作为接口使用特质中放置非抽象的成员特质的模板操作特质的混入对象操作特质的执行链…

T31开发笔记: 使用FTP上传下载文件

若该文为原创文章&#xff0c;转载请注明原文出处 一、前言 最段时间&#xff0c;在开发IPC时&#xff0c;突然想到把录制好的MP4文件上传到服务器&#xff0c;考虑了一些方法&#xff0c;感觉用TFP方式比较好&#xff0c;可以下载和上传文件&#xff0c;只需要搭建一个简单的…

【Mybatis编程:修改数据(动态SQL)】

目录 1. 在AlbumMapper.java中添加抽象方法 2. 在AlbumMapper.xml中配置SQL 3. 在AlbumMapperTests.java中编写并执行测试 1. 在AlbumMapper.java中添加抽象方法 在AlbumMapper.java中添加抽象方法&#xff1a; /** * 修改相册数据 * * param album 封装了被修改的相册的…

【Mybatis编程:批量插入相册(动态SQL)】

目录 1. 书写SQL语句 2. 在AlbumMapper.java中添加抽象方法 3. 在AlbumMapper.xml中配置SQL 4. 在AlbumMapperTests.java中编写并执行测试 1. 书写SQL语句 需要执行的SQL语句大致是&#xff1a; insert into pms_album (name, description, sort) values (?,?,?), (?…

AcWing算法基础课笔记 1.基础算法

目录AcWing算法基础课笔记 1.基础算法二分排序基本思想代码归并排序基本思路代码高精度计算加法减法乘法除法前缀和一维二维AcWing算法基础课笔记 1.基础算法 二分排序 基本思想 基于分治的思想 确定哨兵xxx&#xff1a;可以取左边界&#xff0c;中间值&#xff0c;右边界&…

Docker的容器管理操作

Docker的容器管理操作Docker的容器管理操作1. 创建容器2. 启动容器3、查看容器的运行状态4、创建并启动容器5、在后台持续运行 docker run 创建的容器6、停止容器7、 删除容器8、 容器的进入9、查看容器的元数据——docker inspect10、容器日志11、宿主机和容器之间的文件复制将…