并查集练习——省份数量

简介: 并查集练习——省份数量

力扣原题链接:省份数量

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

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

给你一个 n x n 的矩阵 isConnected ,其中 isConnectedi = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnectedi = 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
isConnectedi 为 1 或 0
isConnectedi == 1
isConnectedi == isConnectedj

package com.harrison.class10;

/**
 * @author Harrison
 * @create 2022-03-19-13:11
 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
 */
public class Code02_FriendCircles {
    // https://leetcode.com/problems/friend-circles/
    public static class UnionFind{
        // parent[i]=k i的父亲是K
        public int[] parent;
        // size[i]=k 如果i是代表结点,size[i]才有意义,否则无意义
        // i所在的集合大小是k
        public int[] size;
        // 辅助结构
        public int[] help;
        // 一共有多少个集合
        public 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]=i;
            }
        }

        // 从i开始往上,往上到不能再往上,就是代表结点,返回
        // 这个过程要做路径压缩
        public int find(int i){
            int hi=0;
            while (i!=parent[i]){
                help[hi++]=i;
                i=parent[i];
            }
            for(hi--; hi>=0; hi--){
                parent[help[hi]]=i;
            }
            return i;
        }

        public void union(int i,int j){
            int f1=find(i);
            int f2=find(j);
            if(f1!=f2){
                if(size[f1]>=size[f2]){
                    size[f1]+=size[f2];
                    parent[f2]=f1;
                }else{
                    size[f2]+=size[f1];
                    parent[f1]=f2;
                }
                sets--;
            }
        }

        public int sets(){
            return sets;
        }
    }

    public static int findCircleNum(int[][] isConnected){
        int N=isConnected.length;
        // {0} {1} {2} {3}...{N-1}
        UnionFind unionFind=new UnionFind(N);
        for(int i=0; i<N; i++){
            for(int j=i+1; j<N; j++){
                if(isConnected[i][j]==1){// i和j互相认识
                    unionFind.union(i,j);
                }
            }
        }
        return unionFind.sets;
    }
}
相关文章
基于宜搭的“企业报销流程”实践案例
报销是一个企业的典型场景,本案例着重讲述一个典型的财务报销流程的搭建,已介绍宜搭流程相关的核心功能。报销由员工发起申请,填写报销项以及对应的详情信息,发起审批流程。审批流程计划设置为:当前提交人主管,审批人所在部门对应的财务接口人,财务总监(如果金额大于10000元,则需要加入该角色)
基于宜搭的“企业报销流程”实践案例
|
存储 机器学习/深度学习 分布式计算
HDFS Federation简介
背景 熟悉大数据的人应该都知道,HDFS 是一个分布式文件系统,它是基于谷歌的 GFS 思路实现的开源系统,它的设计目的就是提供一个高度容错性和高吞吐量的海量数据存储解决方案。在经典的 HDFS 架构中有2个 NameNode 和多个 DataNode 的,如下: 从上面可以看出 HDFS 的架构其实大致可以分为两层: Namespace:由目录,文件和数据块组成,支持常见的文件系统操作,例如创建,删除,修改和列出文件和目录。
|
网络协议 Unix 应用服务中间件
Supervisor安装与配置
Supervisor安装与配置
|
自然语言处理 达摩院 搜索推荐
阿里推出文本搜索排序新技术,登顶国际权威NLP榜单MS MARCO
3月28日,阿里巴巴团队以0.450的得分,刷新了国际权威自然语言处理(NLP)榜单MS MARCO短文本检索排序任务历史纪录。据悉,搜索团队最新研发的文本检索及排序技术已通过阿里云智能开放搜索OpenSearch产品对外输出。
1455 0
阿里推出文本搜索排序新技术,登顶国际权威NLP榜单MS MARCO
uni-app自定义摄像头拍照添加人物框
uni-app自定义摄像头拍照添加人物框
659 1
uni-app自定义摄像头拍照添加人物框
|
编译器 C语言 C++
g++命令编译出来的文件体积过大解决方案
g++命令编译出来的文件体积过大解决方案
766 0
|
JSON 前端开发 Java
MARKDOWN上传图片的基本实现
MARKDOWN上传图片的基本实现
MARKDOWN上传图片的基本实现
|
SQL 消息中间件 Kafka
atlas 集成cdh
atlas 集成cdh
atlas 集成cdh
|
前端开发 关系型数据库 大数据
2019必看8大技术大会&300+公开课全集(500+PDF下载)
2019年即将结束之际,开发者社区小编整理了年度最值得关注的技术大会直播合辑,快来围观吧~
42311 0
2019必看8大技术大会&300+公开课全集(500+PDF下载)
|
数据中心
声光双控延时照明电路设计
本文设计的声光双控照明电路用集成电路和微触发可控硅制作,声光自动控制。白天关闭夜晚人来灯亮,人走灯灭,具有灵敏低耗、性能稳定、使用寿命长、节电效果明显等特点,且电路简单、体积小、制作安装方便。
声光双控延时照明电路设计