当前位置: 首页 > news >正文

Java并查集详解(附Leetcode 547.省份数量讲解)

一、并查集概念

并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。

并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。

【摘自菜鸟教程】

只看上面这段例子可能会发懵,让我们来看一个详细的例子。

大家看剧都知道,古时候基本上都会拉帮结派,形成大大小小许多帮派。这些帮派都会有等级划分,大当家,二当家,等等。类似于这样的结构。

假如三当家的小弟想知道他真正的老大是谁,那么他就去问三当家,三当家就告诉他他的老大是二当家,然后这个小弟就去问二当家,二当家就会告诉他,他的老大是大当家,那么小弟再去问大当家,大当家就会告诉他,我才是你真正的老大。那么所有这些人,他们的老大都只有一个,那就是“大当家”。

翻译成大白话说就是:如果一个元素的老大不是他自己,那么他自己的老大的老大就是他的老大。

这就是小弟找老大的过程,也就是“并查集”中“查”的部分。

假如突然有一天,大当家干掉了自己的死对头(另一个帮派的老大)并成功吞并了他的帮派。

那么现在,另一个帮派的小弟再找大哥时,就会发现,此时自己的大哥已经变成了另一个帮派的大哥。这就是“并查集”中“并”的部分。

二、并查集在算法题中应用

接下来我们根据一道算法题来看一下如何使用并查集。

Leetcode 547. 省份数量

题目描述

有 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

提示:

  • 1 <= n <= 200
  • n == isConnected.length
  • n == isConnected[i].length
  • isConnected[i][j] 为 1 或 0
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

简单分析题目后发现,这就是一个找大哥的过程。每一个省份算作一个帮派,有几个“大哥”就是有几个省份,所以该题可以使用并查集

直接上代码:

class Solution {public int findCircleNum(int[][] isConnected) {// 定义一个新数组用来记录每个城市的大哥int[] city = new int [isConnected.length];// 初始化数组,刚开始每个人的大哥都是自己for (int i = 0; i < city.length; i++) {city[i] = i;}// 遍历城市数组for (int i = 0; i < isConnected.length; i++) {for (int j = 0; j < isConnected[0].length; j++) {// 如果时同一个城市或者两个城市不相连,那么直接继续if (i == j || isConnected[i][j] == 0) {continue;}// “并”的过程,i城市的大哥就是j城市的大哥city[find(i, city)] = find(j, city);}}// 遍历 city 数组,看看有几个大哥int res = 0;for (int i = 0; i < city.length; i++) {if (i == city[i]) {res++;}}return res;}/*** “查”的过程,查找x城市的大哥** @param x 要找大哥的城市* @param city 定义每个城市的大哥的数组* @return x城市的大哥*/public int find(int x, int[] city) {// 如果 x 的大哥不是 x,那么就去找 x 大哥的大哥while (city[x] != x) {x = city[x];}return x;}
}

相关文章:

Java并查集详解(附Leetcode 547.省份数量讲解)

一、并查集概念 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。 并查集的思想是用一个数组表示了整片森林&#xff08;parent&#xff09;&#xff0c;树的根节点唯一标识了一个集合&#xff0c;我们只要找到了某个元素的的树根&#xff0c;…...

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…...

更新一条SQL的执行流程

在 MySQL中&#xff0c;条更新 SQL 语句执行的过程通常包括以下主要步骤: 1.客户端发送请求: 客户端应用程序(如数据库连接器或应用程序)构建一条 UPDATE SQL 语句&#xff0c;并将其发送到 MySOL 服务器端。 2.查询解析和优化: MySQL 服务器接收到请求后&#xff0c;先进行语法…...

深入理解nginx mp4流媒体模块[上]

目录 1. 引言2. 配置3. 源码分析3.1 配置指令3.1.1 mp43.1.2 mp4_buffer_size3.1.3 mp4_max_buffer_size3.1.4 mp4_start_key_frame 3.2 MP4的请求处理过程3.2.1 预处理3.2.2 找到并打开本地mp4文件3.2.3 解析请求参数3.2.4 MP4文件的处理 深入理解nginx mp4流媒体模块[上] 深入…...

Go 之 Gin 框架

Gin 是一个 Go (Golang) 编写的轻量级 web 框架&#xff0c;运行速度非常快&#xff0c;擅长 Api 接口的高并发&#xff0c;如果项目的规模不大&#xff0c;业务相对简单&#xff0c;这个时候我们也推荐您使用 Gin&#xff0c;特别适合微服务框架。 简单路由配置 package mai…...

vue3+threejs新手从零开发卡牌游戏(二十一):添加战斗与生命值关联逻辑

首先将双方玩家的HP存入store中&#xff0c;stores/common.ts代码如下&#xff1a; import { ref, computed } from vue import { defineStore } from piniaexport const useCommonStore defineStore(common, () > {const _font ref() // 字体const p1HP ref(4000) // 己…...

Linux内核err.h文件分析

在阅读和编写内核相关的代码时&#xff0c;经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例&#xff0c;内核版本为5.15。 这个文件的代码如下&#xff1a; /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_ERR_H #define _L…...

Qt 富文本处理 (字体颜色大小加粗等)

Qt中支持HTML的控件有textEdit 、label 、textBrowser 。 接口&#xff1a;setHtml("Qt"); toHtml(). 文本样式设置 : 可分字设置 &#xff0c;主要使用QTextCharFormat类进行文本样式设置。 示例&#xff1a; QTextCharFormat fmt; //粗体 fmt.setFontWeight…...

消息队列的七种经典应用场景

在笔者心中&#xff0c;消息队列&#xff0c;缓存&#xff0c;分库分表是高并发解决方案三剑客。 在职业生涯中&#xff0c;笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章&#xff0c;笔者结合自己的真实经历&#xff0c;和大家分享…...

uniapp 微信小程序 canvas 手写板文字重复倾斜水印

核心逻辑 先将坐标系中心点通过ctx.translate(canvasw / 2, canvash / 2) 平移到canvas 中心&#xff0c;再旋转设置水印 假如不 translate 直接旋转&#xff0c;则此时的旋转中心为左上角原点&#xff0c;此时旋转示意如图所示 当translate到中心点之后再旋转&#xff0c;此…...

JavaScript如何制作轮播图

在JavaScript中实现轮播图可以通过多种方式&#xff0c;但最常见的方式是使用数组来存储图片&#xff0c;然后使用setInterval函数定期更改显示的图片。下面是一个简单的例子&#xff1a; 首先&#xff0c;你需要在HTML中设置一些用于显示图片的<img>标签&#xff0c;以…...

【面试经典150 | 动态规划】零钱兑换

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 322. 零钱兑换 解题思路 方法一&#xff1a;动态规划 定义状态 dp[i] 表示凑成总金额的最少硬币个数。 状态转移 从小到大枚举要凑成的金额 i&#xff0c;如果当前…...

什么是防火墙,部署防火墙有什么好处?

与我们的房屋没有围墙或界限墙一样&#xff0c;没有防护措施的计算机和网络将容易受到黑客的入侵&#xff0c;这将使我们的网络处于巨大的风险之中。因此&#xff0c;就像围墙保护我们的房屋一样&#xff0c;虚拟墙也可以保护和安全我们的设备&#xff0c;使入侵者无法轻易进入…...

学习鸿蒙基础(10)

目录 一、轮播组件 Swiper 二、列表-List 1、简单的List 2、嵌套的List 三、Tabs容器组件 1、系统自带tabs案例 2、自定义导航栏&#xff1a; 一、轮播组件 Swiper Entry Component struct PageSwiper {State message: string Hello Worldprivate SwCon: SwiperControl…...

阿里云对象存储OSS入门

阅读目录 一、阿里云OSS的使用 1、OSS是什么&#xff1f;2、OSS的使用 二、阿里云OSS的使用三、图床的搭建四&#xff1a;图床绑定阿里云OSS 编写不易&#xff0c;如果我的文章对你有帮助的话&#xff0c;麻烦小伙伴还帮忙点个赞再走&#xff01; 如果有小伙伴觉得写的啰嗦&a…...

[幻灯片]软件需求设计方法学全程实例剖析-03-业务用例图和业务序列图

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 pdf已上传至本号的CSDN资源&#xff0c;或到以下地址下载&#xff1a; http://umlchina.com/training/umlchina_03_bm.pdf...

ctfshow-web入门-xxe

什么是xxe&#xff1f; XXE&#xff0c;全称XML External Entity Injection&#xff0c;即XML外部实体注入。这是一种针对应用程序解析XML输入类型的攻击。当包含对外部实体的引用的XML输入被弱配置的XML解析器处理时&#xff0c;就会发生这种攻击。这种攻击通过构造恶意内容&…...

Docker数据卷挂载

一、容器与数据耦合的问题: 数据卷是虚拟的&#xff0c;不真实存在的&#xff0c;它指向文件中的文件夹 &#xff0c;属主机文件系统通过数据卷和容器数据进行联系&#xff0c;你改变我也改变。 解决办法&#xff1a; 对宿主机文件系统内的文件进行修改&#xff0c;会立刻反应…...

QT_day4:对话框

1、完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…...

矢量数据库:连接人工智能应用程序的数据复杂性与可用性的桥梁

关注我的公众号&#xff1a;Halo咯咯 简介 矢量数据库是一种专门设计的数据库&#xff0c;专注于高效地存储、管理和操作矢量数据。与传统数据库处理标量值&#xff08;如数字、字符串、日期&#xff09;不同&#xff0c;矢量数据库针对的是那些表现为多维数据点的向量&#xf…...

STM32实战指南_基于STM32F103的智能交通灯系统设计与实现(硬件+软件+调试)

1. 项目背景与需求分析 十字路口的交通拥堵是城市治理的经典难题。传统定时切换的交通灯就像个固执的老头子&#xff0c;不管车多车少都按固定节奏工作&#xff0c;经常出现一边排长龙、另一边空荡荡的尴尬场景。这次我们要用STM32F103这颗"最强大脑"给交通灯装上&qu…...

从零构建:基于C语言的Modbus RTU从站驱动开发指南

1. Modbus RTU从站驱动开发入门指南 第一次接触Modbus RTU从站开发时&#xff0c;我完全被各种专业术语搞晕了。后来在工厂里调试一个温湿度传感器时&#xff0c;才真正理解这个协议的精妙之处——它就像车间里老师傅们约定俗成的对话方式&#xff0c;主设备问一句&#xff0c;…...

Realistic Vision V5.1虚拟摄影棚教程:负向提示词组合策略与失效排查

Realistic Vision V5.1虚拟摄影棚教程&#xff1a;负向提示词组合策略与失效排查 你是不是也遇到过这样的情况&#xff1a;用Realistic Vision V5.1生成的人像&#xff0c;明明提示词写得很好&#xff0c;但出来的照片总有些不对劲——手指扭曲得像外星人&#xff0c;脸部细节…...

Apache James邮件服务器企业级部署与安全配置指南

Apache James邮件服务器企业级部署与安全配置指南 【免费下载链接】james-project James Project是一个用于电子邮件服务器的开源软件。适用于需要为其邮件基础设施提供强大和可靠的邮件传输代理的企业和组织。具有可扩展性、灵活性和易于使用的特点。 项目地址: https://git…...

告别Vue组件匿名时代:用vite-plugin-vue-setup-extend给你的<script setup>加个名字

为Vue组件正名&#xff1a;vite-plugin-vue-setup-extend深度整合指南 在Vue 3的组合式API开发中&#xff0c;<script setup>语法糖以其简洁性赢得了开发者的青睐。但当你打开Vue DevTools准备调试时&#xff0c;满屏的"Anonymous Component"是否曾让你感到困扰…...

基于深度学习的CT肺部分割技术:在医学影像分析中实现95% Dice系数的精准自动化方案

基于深度学习的CT肺部分割技术&#xff1a;在医学影像分析中实现95% Dice系数的精准自动化方案 【免费下载链接】lungmask Automated lung segmentation in CT 项目地址: https://gitcode.com/gh_mirrors/lu/lungmask 在医学影像分析领域&#xff0c;CT肺部分割一直是临…...

手把手教你用FreeRTOS创建第一个任务:从栈初始化到SVC调用的完整流程

深入解析FreeRTOS任务启动机制&#xff1a;从栈初始化到任务切换的实战指南 在嵌入式开发领域&#xff0c;实时操作系统(RTOS)已成为复杂项目的标配工具。作为开源RTOS中的佼佼者&#xff0c;FreeRTOS凭借其轻量级、可移植性强等特点&#xff0c;在STM32等Cortex-M系列MCU上广…...

终极指南:如何用Ice轻松管理你的Mac菜单栏,打造清爽高效的工作空间

终极指南&#xff1a;如何用Ice轻松管理你的Mac菜单栏&#xff0c;打造清爽高效的工作空间 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 还在为杂乱的macOS菜单栏烦恼吗&#xff1f;Ice是一款专为…...

FUTURE POLICE语音对齐系统:MySQL数据库集成与结果分析实战

FUTURE POLICE语音对齐系统&#xff1a;MySQL数据库集成与结果分析实战 1. 语音对齐数据管理的挑战与解决方案 语音识别与对齐技术正在改变我们处理音频内容的方式。FUTURE POLICE系统凭借其毫秒级精度的强制对齐能力&#xff0c;为语音数据处理树立了新标准。然而&#xff0…...

计算机网络知识应用:保障分布式StructBERT微服务集群通信

计算机网络知识应用&#xff1a;保障分布式StructBERT微服务集群通信 最近在搞一个基于StructBERT模型的智能问答系统&#xff0c;随着用户量上来&#xff0c;单台服务器明显扛不住了&#xff0c;响应慢不说&#xff0c;还动不动就挂掉。没办法&#xff0c;只能上微服务集群&a…...