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];}
}

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

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

相关文章

ChatGPT引领量化交易革命:AI在金融创新的浪潮中崭露头角

随着科技的飞速发展,金融领域正迎来一场前所未有的创新浪潮。在这场变革中,ChatGPT凭借其卓越的自然语言处理能力和深度学习能力,正引领量化交易进入新时代。 量化交易,作为现代金融领域的一种重要交易方式,依赖于复杂的数学模型和大量的历史数据来制定交易策略。然而,传…

揭秘速成软件书:彩虹之下的真相

在这个信息爆炸的时代&#xff0c;我们常常被诱惑性的标题所吸引&#xff1a;“三天掌握Python编程”&#xff0c;“一周精通Photoshop”&#xff0c;书架上堆满了各种各样的速成指南&#xff0c;这些声称能迅速提升技能的书籍&#xff0c;真的能做到它们所承诺的吗&#xff1f…

C++与C语言

C之所以是C&#xff0c;和面向过程的C语言相比&#xff0c;它加了一个类&#xff0c;还有一个是模板。 引入 C语言这种面向过程的编译语言可以将待解的问题分解成若干个子问题&#xff0c;面向对象程序设计则是建立在结构化程序设计方法的基础上&#xff0c;完全避免了结构化程…

前任在代码里下毒,支付下单居然没加幂等?

首先蜗牛和大家从以下几个方面好好剖析一下接口幂等吧。 什么是接口幂等 比较专业的术语&#xff1a;其任意多次执行所产生的影响均与第一次执行的影响相同。 也就是多次调用的情况下&#xff0c;接口最终得到的结果是一致的。 那么为什么需要幂等呢&#xff1f; 那么哪些接…

中科院自动化所实习总结(完)

实习单位 中国科学院自动化所 工作内容 项目涉密&#xff0c;不便介绍 负责内容 负责完善文档&#xff0c;画流程图&#xff0c;UML类图之类的写小模块的代码 实习感悟 大概的整个过程 其实在这段实习中&#xff0c;我得到的最多的并不是技术上的成长&#xff0c;而是业…

数据结构03:栈、队列和数组 队习题01[C++]

考研笔记整理~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构03&#xff1a;栈、队列和数组_-CSDN博客~&#x1f95d;&#x1f95d; 本篇作为链表的代码补充&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 第1版&#xff1a;王道书的课后习题…

实战-后台管理系统SQL注入漏洞

对于edu来说&#xff0c;是新人挖洞较好的平台&#xff0c;本次记录一次走运的捡漏0x01 前景 在进行fofa盲打站点的时候&#xff0c;来到了一个后台管理处看到集市二字&#xff0c;应该是edu站点 确认目标身份&#xff08;使用的quake进行然后去ipc备案查询&#xff09; 网…

Qt实现Kermit协议(一)

1 概述 Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。 其特性如下: Kermit文件运输协议是一个半双工的通信协议。它支持7位ASCII字符。数据以可多达96字节长度的可变长度的分组形式传输。对每个被传送分组需要一个确认。Kerm…

LeetCode刷题笔记之hot 100(二)

1. 322【零钱兑换】- 动态规划 题目&#xff1a; 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回…

关于视场角,你需要知道这些!

视场角在光学工程中又称视场&#xff0c;视场角的大小决定了光学仪器的视野范围。视场角又可用FOV&#xff08;Field of view&#xff09;表示&#xff0c;其与焦距的关系如下&#xff1a;像高 EFL*tan (半FOV)&#xff1b;EFL为焦距&#xff1b;FOV为视场角。即以入瞳位置为顶…

一个包一条命令,我实现了对整个前端项目代码的校验

在现代前端开发中&#xff0c;代码校验与风格统一不仅是良好编程习惯的体现&#xff0c;更是提升项目质量、保障代码可维护性与减少潜在bug的关键环节。然而&#xff0c;面对诸如ESLint、Commitlint、Stylelint等多样化的校验工具&#xff0c;以及针对React、Vue等不同前端框架…

笔记本电脑上部署LLaMA-2中文模型

尝试在macbook上部署LLaMA-2的中文模型的详细过程。 &#xff08;1&#xff09;环境准备 MacBook Pro(M2 Max/32G); VMware Fusion Player 版本 13.5.1 (23298085); Ubuntu 22.04.2 LTS; 给linux虚拟机分配8*core CPU 16G RAM。 我这里用的是16bit的量化模型&#xff0c;…

java线程(一)--进程,多线程,synchronized和lock锁,JUC,JUnit

Java线程入门 单核CPU和多核CPU的理解 单核CPU&#xff0c;其实是一种假的多线程&#xff0c;因为在一个时间单元内&#xff0c;也只能执行一个线程的任务。例如&#xff1a;虽然有多车道&#xff0c;但是收费站只有一个工作人员在收费&#xff0c;只有收了费才能通过&#xf…

LeetCode226:反转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 解题思想 使用前序遍历和后序遍历比较方便 代码 class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) return root;swap(root->left, root…

nginx 常用功能

添加白名单配置 if ($clientRealIp ~ "192.157.34.245|17.213.126.21") {rewrite ^.*$ /403.html last;break; } 添加站点配置信息 nginx.conf 文件最后一行添加 并新建vhost 目录 include /usr/local/nginx/conf/vhost/*.conf;include vhost/*.conf;

什么是ISP住宅IP?相比于普通IP它的优势是什么?

什么是ISP住宅IP&#xff1f; ISP住宅IP是指由互联网服务提供商&#xff08;ISP&#xff09;分配给住宅用户的IP地址。它是用户在家庭网络环境中连接互联网的标识符&#xff0c;通常用于上网浏览、数据传输等活动。ISP住宅IP可以是动态分配的&#xff0c;即每次连接时都可能会…

【DevOps工具篇】 OpenLDAP的LDAP服务器(slapd)是什么?

目录 OpenLAP的LDAP服务器(slapd)是什么基本功能安全性管理性可靠性和可扩展性调优OpenLDAP的服务器基本功能简单身份验证和SASL身份验证LDAP模式OpenLDAP服务器管理LDAP服务器配置LDAP数据备份和还原slapcatslapaddslapindex

C++类复习

C类 1. 类内成员函数隐式声明为inline class Str {int x;int y 3; public:inline void fun(){std::cout<<"pf,yes!"<<std::endl;} };这段代码不会报错&#xff0c;但是类内的成员函数隐式声明为inline函数&#xff0c;不需要单独写在前面。因此将成员…

BOM系统:贯穿制造全程的管理利器

在制造行业中&#xff0c;BOM系统的应用已经成为提高生产效率、降低成本和确保产品质量的关键因素。BOM系统作为产品结构和物料清单的管理工具&#xff0c;为制造企业提供了全面的控制和协同能力。 1.产品设计与开发&#xff1a;在产品设计阶段&#xff0c;BOM系统为工程师提供…

基于自动编码器的预训练模型方法模型预训练方法RetroMAE和RetroMAE-2

文章目录 RetroMAERetroMAE详情编码解码增强解码 RetroMAE-2RetroMAE-2详情编码[CLS]解码OT解码和训练目标向量表征 总结参考资料 RetroMAE RetroMAE 出自论文《RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder》&#xff0c;是一种针对于…