LeetCode-统计完全连通分量的数量

题目要求:

给你一个整数 n 。现有一个包含 n 个顶点的 无向 图,顶点按从 0 到 n - 1 编号。给你一个二维整数数组 edges 其中 edges[i] = [ai, bi] 表示顶点 ai 和 bi 之间存在一条 无向 边。

返回图中 完全连通分量 的数量。

如果在子图中任意两个顶点之间都存在路径,并且子图中没有任何一个顶点与子图外部的顶点共享边,则称其为 连通分量 。

如果连通分量中每对节点之间都存在一条边,则称其为 完全连通分量 。

示例 1:

输入:n = 6, edges = [[0,1],[0,2],[1,2],[3,4]]
输出:3
解释:如上图所示,可以看到此图所有分量都是完全连通分量。

题目解析:

题目中要求输入一个整数和一个数组,整数代表一共有几个顶点,二维数组表示这几个顶点之间有没有连线。最后要求输出这个顶点中完全连通分量的个数,所谓的完全连通分量是指几个顶点之间相互连接,没有任何一个顶点与子图外部的顶点共享边。也就是要围成一个圈。

当读完题第一时间想到的方法就是使用并查集的方式找出分量的数量,再去判断该分量是不是完全连通分量。

并查集的方法再此就不多做解释了,具体可见我的另一篇博客,里面我具体介绍了并查集算法的思想以及实现。

LeetCode547——省份数量(并查集)

当实现完并查集后,我们就可以得到连通分量的个数,之后我们就要去判断该连通分量是不是完全连通分量了。

这里需要用到一些数学的思维,我们可以通过整个图中边和点的数量来判断该图是不是完全连通分量,如果图中有m个顶点,有n条边,当n=m*(m-1)/2时。因为每个节点都要与其他的节点具有边,因此要m*(m-1),但是这样会重复统计,因此还要除以2.所以当边和顶点数满足此关系时,其就是个完全连通分量。就像当有四个顶点时,应有下图:

所以下面我们就要拿到每个连通分量中的顶点数和边数。这里我用了两个哈希表来表示。

用哈希表的key表示连通图的序号,用value表示拥有的点和边。

首先遍历p数组,数组中表示每个顶点的父节点,一个父节点就可以表示一个连通图,因为一个连通图的父节点都是一样的,如果其父节点存在,那么把该点加到该连通分量中,否则再哈希表中新加入一个key值。

但是由于本题中一个节点可能会连接3个乃至更多的节点,并且连接结构可能比较复杂,所以最后得到的数组中可能并不完善,可能会有间接的父节点,就比如我们可能会得到数组{1,2,2,2},这个是存在间接父节点的,第0个节点的父节点是1,第一个元素的父节点就2.这个数组就等价于{2,2,2,2}。

因此我们不能直接用p[i]来找到其真正的父节点,要再次使用一次find方法才能找到其真正的父节点。

在寻找边时我们就可以直接遍历输入的二维数组,将边的数量放入到哈希表中。

最后我们再次遍历节点,找到每个节点的父节点,根据哈希表得到边和顶点的数量进行判断,当一个父节点判断过后就将设设为-1,在循环中遇到-1直接跳到下一次循环,因为等于-1时该连通分量已经计算过了。遍历结束后我们就得到了答案。

代码实现:

class Solution {
    public int countCompleteComponents(int n, int[][] edges) {
        int len = edges.length;
        int[] p = new int[n];
        for(int i=0;i<n;i++){
            p[i]=i;
        }
        for(int j=0;j<len;j++){
            union(p,edges[j][0],edges[j][1]);
        }
        Map<Integer,Integer> map = new HashMap<>();
        for(int k =0;k<n;k++){
            int f = find(p,k);
            if(!map.containsKey(f)){
                map.put(f,1);
            }else{
                map.put(f,map.get(f)+1);
            }
        }
        Map<Integer,Integer> s = new HashMap<>();
        for(int i=0;i<n;i++){
            s.put(i,0);
        }
        for(int i=0;i<len;i++){
            int key = find(p,edges[i][0]);
            s.put(key,s.get(key)+1);
        }
        int res=0;
        for(int i=0;i<n;i++){
            int x = map.get(p[i]);
            if(x==-1){
                continue;
            }
            if(s.get(p[i])==(x*(x-1))/2) res++;
            map.put(p[i],-1);
        }
        return res;
    }
    public void union(int[] p,int index1,int index2){
        p[find(p,index1)]=find(p,index2);
    }
    public int find(int[] p,int index){
        if(p[index]!=index){
            p[index]=find(p,p[index]);
        }
        return p[index];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OPPO云VPC网络实践

1 OPPO 云网络现状 随着OPPO业务的快速发展&#xff0c;OPPO云规模增长迅速。大规模虚拟实例的弹性伸缩、低延时需求对网络提出了诸多挑战。原有基于VLAN搭建的私有网络无法解决这些问题&#xff0c;给网络运维和业务的快速上线带来了挑战。 梳理存在的主要问题如下&#xf…

Tik Tok与抖音:一母同胞的不同风采

随着智能手机的普及和网络技术的飞速发展&#xff0c;短视频平台已经成为了大众娱乐生活中不可或缺的一部分。在众多的短视频平台中&#xff0c;Tik Tok和抖音无疑是最受欢迎的两个。尽管它们有着相似的基因——都源自中国&#xff0c;但两者在定位、内容、用户群体以及运营策略…

解决VScode中matplotlib图像中文显示问题

一、更改配置文件 参考这个文件路径找到自己Python环境下的matplotlibrc文件并用记事本打开。 用ctrl F寻找下面的这两行并将前面的#删除&#xff0c;保存并退出。 font.family: sans-serif font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, N…

红黑树介绍与模拟实现(insert+颜色调整精美图示超详解哦)

红黑树 引言红黑树的介绍实现结点类insert搜索插入位置插入调整当parent为gparent的左子结点当parent为gparent的右子结点 参考源码测试红黑树是否合格总结 引言 在上一篇文章中我们认识了高度平衡的平衡二叉树AVL树&#xff1a;戳我看AVL树详解哦 &#xff08;关于旋转调整的…

springboot 项目整合easy-captcha验证码功能

效果 1、验证码使用easy-captcha,在pom文件增加依赖 <!-- google 验证码 --><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId></dependency> 2、增加获取kaptcha的ctrl package com.*.*.s…

AcWing 786. 第k个数——算法基础课题解

AcWing 786. 第k个数 文章目录 题目描述思路CGo 题目描述 给定一个长度为 n的整数数列&#xff0c;以及一个整数 k&#xff0c;请用快速选择算法求出数列从小到大排序后的第 k 个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数&#xff08;所有整数均在 …

韩顺平 | 零基础快速学Python

环境准备 开发工具&#xff1a;IDLE、Pycharm、Sublime Text、Eric 、文本编辑器&#xff08;记事本/editplus/notepad&#xff09; Python特点&#xff1a;既支持面向过程OOP、也支持面向对象编程&#xff1b;具有解释性&#xff0c;不需要编程二进制代码&#xff0c;可以直…

MySQL 导入库/建表时/出现乱码

问题描述&#xff1a; 新建不久的项目在使用Navicat for MySQL进行查看数据&#xff0c;发现表中注释的部分乱码&#xff0c;但是项目中获取的数据使用不会。 猜测因为是数据库编码和项目中使用的不一样&#xff0c;又因为项目的连接语句定义了需要编码&#xff0c;故项目运行…

特征融合篇 | 结合内容引导注意力 DEA-Net 思想 实现双主干特征融合新方法 | IEEE TIP 2024

本篇改进已集成到 YOLOv8-Magic 框架。 摘要—单幅图像去雾是一个具有挑战性的不适定问题,它从观察到的雾化图像中估计潜在的无雾图像。一些现有的基于深度学习的方法致力于通过增加卷积的深度或宽度来改善模型性能。卷积神经网络(CNN)结构的学习能力仍然未被充分探索。本文…

AI大模型与网球运动结合的应用场景及案例分析

AI大模型与网球运动结合的未来前景是广阔的&#xff0c;它不仅能够提升运动员的训练和比赛表现&#xff0c;还能改善教练的策略制定、增强观众的观赛体验以及优化网球赛事的管理。以下是几个具体的应用场景&#xff1a; 1. 运动员技能和表现分析 AI大模型可以通过分析高速摄像…

8.list容器的使用

文章目录 list容器1.构造函数代码工程运行结果 2.赋值和交换代码工程运行结果 3.大小操作代码工程运行结果 4.插入和删除代码工程运行结果 5.数据存取工程代码运行结果 6.反转和排序代码工程运行结果 list容器 1.构造函数 /*1.默认构造-无参构造*/ /*2.通过区间的方式进行构造…

FPGA实现CLAHE算法(Verilog)

在介绍CLAHE算法之前必须要先提一下直方图均衡化&#xff0c;直方图均衡化算法是一种常见的图像增强算法&#xff0c;可以让像素的亮度分配的更加均匀从而获得一个比较好的观察效果。 左边是原图&#xff0c;右边是经过直方图均衡化后图&#xff0c;可以看到肋骨什么的可以更…

鸿蒙应用开发-ArkUI 计算器

一、效果图 在正式介绍ArkUI计算器应用之前&#xff0c;我们先来一睹其风采。效果图上的计算器界面简洁大方&#xff0c;每个按钮都经过精心设计&#xff0c;颜色搭配恰到好处&#xff0c;使得整体界面既美观又实用。数字、运算符等按钮排列整齐&#xff0c;用户可以一目了然地…

鸽哒言讯独家最新im即时通讯系统双端源码下载 (中越双语)带安卓未封装、苹果未封装、PC端(全开源)+部署教程

独家最新im即时通讯系统双端源码下载 &#xff08;中越双语&#xff09;带安卓未封装、苹果未封装、PC端&#xff08;全开源&#xff09;部署教程鸽哒IM即时通讯系统是一款类似于weixin的即时通讯软件&#xff0c;具有独立开发的特点。与网络其他聊天软件相比&#xff0c;即时聊…

HTMLCSSJS

HTML基本结构 <html><head><title>标题</title></head><body>页面内容</body> </html> html是一棵DOM树, html是根标签, head和body是兄弟标签, body包括内容相关, head包含对内容的编写相关, title 与标题有关.类似html这种…

Word中插入Endnote参考文献时显示乱码

近期在写文章需要插入参考文献&#xff0c;使用Endnote插入时显示乱码&#xff0c;如下图所示&#xff1a; 文章末尾显示{ADDIN EN REFILIST } 解决方法 在网上找了诸多方法尝试也没有解决&#xff0c;最终找到一篇博客介绍了一种方法&#xff1a; word选项—高级&#xff1…

16.springboot项目下使用事务(springboot-016-transaction)

事务是一个完整的功能&#xff0c;也叫作是一个完整的业务 事务只跟什么SQL语句有关&#xff1f;事务只跟DML语句有关系&#xff1a;增删改 DML,DQL,DDL,TCL,DCL 首先添加两个依赖以及MyBatis代码自动生成插件 <!--MySql驱动--><dependency><groupId>mysql…

【C++】探索C++中的类与对象(上)

​​ &#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ C是一种强大的编程语言&#xff0c;其面向对象的特性使得代码结构更加清晰、易于维护和扩展。在C中&#xff0c;类与…

Elasticsearch 压测实践总结

背景 搜索、ES运维场景离不开压力测试。 1.宿主机层面变更&#xff1a;参数调优 & 配置调整 & 硬件升级2.集群层面变更&#xff1a;参数调优3.索引层面变更&#xff1a;mapping调整 当然还有使用层面变更&#xff0c;使用API调优&#xff08;不属于该文章的讨论范围…

京东获得JD商品详情 API 接口(jd.item_get)的详细使用说明,包括如何通过该接口获取商品的基本信息,包括名称、品牌、产地、规格参数等

通过调用京东商品详情API接口&#xff0c;开发者可以获取商品的基本信息&#xff0c;如名称、品牌、产地、规格参数等。此外&#xff0c;还可以获取商品价格信息&#xff0c;包括原价、促销价和活动信息等。同时&#xff0c;该接口还支持获取商品的销量、评价、图片、描述等详细…