LeetCode547. Friends Circles 利用union find | bfs | dfs三种方法解决

问题来源

此题来源于LeetCode547. Friend Circles,主要运用了并查集(union find)、广度优先遍历(bfs)和深度优先遍历(bfs)三种方法解决。

问题简述

给定一个N×N的矩阵M表示了N个人之见的朋友关系。如果M[i][j]=1那么ij是直接朋友关系;如果M[i][j]=1M[j][k]=1M[i][k]=0,那么ik是间接朋友关系。我们假定有直接和间接朋友关系的人为一个朋友圈,试问M中有几个朋友圈。
比如:

输入: 
[[1,1,0],[1,1,0],[0,0,1]]
输出: 2
解释:第0和第1个人是直接朋友,他们构成1个朋友圈;第2个人自己构成一个朋友圈,所以返回2

又比如:

输入: 
[[1,1,0],[1,1,1],[0,1,1]]
输出: 1
解释:第0和第1个人是直接朋友,第1和第2个人是直接朋友,所以第0和第2个人是间接朋友,这3个人构成了1个朋友圈,所以返回1

值得注意的是:

  • 总是有M[i][j]=M[j][i]

    • 总是有M[i][i]=1
    • 解决方案

      利用union find解决

      此处的并查集用到了路径压缩的优化。

      class Solution {
      private:vector<int> vec;int sz;private:void Initialize(int count){vec = vector<int>(count);sz = count;for (int i = 0; i < count; i++)vec[i] = i;}int findRoot(int p){assert(p >= 0 && p < sz);while (vec[p] != p){//路径压缩vec[p] = vec[vec[p]];p = vec[p];}return vec[p];}void unionNode(int p, int q){assert(p >= 0 && p < sz && q >= 0 && q < sz);int pRoot = findRoot(p);int qRoot = findRoot(q);if (pRoot != qRoot)vec[pRoot] = qRoot;}public:int findCircleNum(vector<vector<int>>& M) {int m = M.size();if (0 >= m)return 0;Initialize(m);for (int i = 0; i < m; i++){for (int j = i + 1 ; j < m; j++){if (M[i][j] == 1)unionNode(i, j);}}int res = 0;for (int i = 0; i < m; i++)if (vec[i] == i)res++;return res;}
      };

      利用bfs解决

      由于问题的特殊性,每次都只要把对角线上的元素放到队列当中即可。

      class Solution {
      private:int sz;private:void bfs(vector<vector<int>> &M, int x){queue<int> q;q.push(x);while(!q.empty()){int newX = q.front();q.pop();M[newX][newX] = 0;for (int i = 0; i < sz; i++){if (1 == M[newX][i]){M[newX][i] = 0;M[i][newX] = 0;if (1 == M[i][i])q.push(i);}}}return;}public:int findCircleNum(vector<vector<int>>& M) {int m = M.size();if (0 >= m)return 0;sz = m;int res = 0;for (int i = 0; i < m; i++){if (1 == M[i][i]){bfs(M,i);res++;}}       return res;}
      };

      利用dfs解决

      dfs与bfs的思路大同小异,但元素过多可能会造成栈溢出。

      class Solution {
      private:int sz;private:void dfs(vector<vector<int>> &M, int x, int y){if (0 == M[x][y])return;M[x][y] = 0;for (int i = 0; i < sz; i++){if (1 == M[x][i]){M[x][i] = 0;M[i][x] = 0;dfs(M, i, i);}}return;}public:int findCircleNum(vector<vector<int>>& M) {int m = M.size();if (0 >= m)return 0;sz = m;int res = 0;for (int i = 0; i < m; i++){if (1 == M[i][i]){dfs(M,i,i);res++;}}  return res;}
      };

      结束语

      以上三种方法最快的是并查集(union find),bfs和dfs的速度差不多,三者也许都还有优化的余地~

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

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

相关文章

Python模块之MyQR——制作个性化动态二维码(超详细)

一、首先安装MyQR 第一种方式&#xff1a;cmd 命令行输入 pip install MyQR 第二种方式&#xff1a;pyCharm中手动选择进行安装 二、 myqr.run() 函数里面的参数 三、编写代码 # encodingutf-8 from MyQR import myqrmyqr.run(words"https://blog.csdn.net/weixin_448…

地址选择控件开发-

先睹为快 闲话少说&#xff0c;我们先来看看今天我们研究的控件的最终效果图(参照天猫的送货地址设置的效果)&#xff1a; “地址选择Web控件”的基本组成&#xff1a; 使用控件举例&#xff1a; <!--需要加载和引用的文件--> <link rel"stylesheet" href&q…

逻辑回归(logistic regression)的本质——极大似然估计

文章目录1 前言2 什么是逻辑回归3 逻辑回归的代价函数4 利用梯度下降法求参数5 结束语6 参考文献1 前言 逻辑回归是分类当中极为常用的手段&#xff0c;因此&#xff0c;掌握其内在原理是非常必要的。我会争取在本文中尽可能简明地展现逻辑回归(logistic regression)的整个推导…

使用mongoose 在 Node中操作MongoDB数据库

MongoDB 关系型和非关系型数据库 关系型数据库&#xff08;表就是关系&#xff0c;或者说表与表之间存在关系&#xff09;。 所有的关系型数据库都需要通过sql语言来操作所有的关系型数据库在操作之前都需要设计表结构而且数据表还支持约束 唯一的主键默认值非空 非关系型…

回调和异步

// 回调函数&#xff1a;一个函数中调用传入的另一个函数 // 这里的callback就是个回调函数 function we(callback,something){something" is cool";callback(something); }function learn(something){console.log(something); }we(learn,"node.js"); //第…

pip install时发生raise ReadTimeoutError(self._pool, None, 'Read timed out.')的解决方案

问题描述 在windows下&#xff0c;python在安装一些包的时候&#xff0c;常常会碰到time out的情况&#xff0c;如下图所示。不管再重试几次都是如此&#xff0c;这时候该怎么办呢&#xff1f; 解决方案 方案一&#xff1a;更换安装源&#xff08;推荐使用豆瓣源&#xff09…

使用Node 操作MySQL数据库

1. 安装 官方文档&#xff1a;https://www.npmjs.com/package/mysql npm install --save mysql2.代码演示 var mysql require(mysql);// 1.创建连接 var connection mysql.createConnection({host : localhost,user : root,password : root,database : my_db …

利用随机森林对特征重要性进行评估

文章目录1 前言2 随机森林&#xff08;RF&#xff09;简介3 特征重要性评估4 举个例子5 参考文献1 前言 随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单&#xff0c;易于实现&#xff0c;计算开销也很小&#xff0c;更令人惊奇的是它在分类和回归上表现出了十…

个人博客总结3

一&#xff0e;昨天做了什么&#xff1f; 昨天利用安卓连接数据库完成一个图片的保存的程序例子&#xff0c;为我们的团队作业刷脸将人脸图片保存到数据中打下基础。 创建了一个相片和数据库保存和查询的工程创建了一个数据库然后将图片保存到数据库中&#xff0c;先将图片转化…

Promise学习——解决回调地狱问题

Promise promise 容器概念&#xff1a; callback hell&#xff08;回调地狱&#xff09;: 文件的读取无法判断执行顺序&#xff08;文件的执行顺序是依据文件的大小来决定的&#xff09;(异步api无法保证文件的执行顺序) var fs require(fs);fs.readFile(./data/a.text,ut…

基于哈希表的索引堆变形(Hackerrank: QHEAP1)

问题来源 此题来自于Hackerrank中的QHEAP1问题&#xff0c;考查了对堆结构的充分理解。成功完成此题&#xff0c;对最大堆或者最小堆的基本操作实现就没什么太大问题了。 问题简述 实现一个最小堆&#xff0c;对3种类型的输入能给出正确的操作&#xff1a; “1 v” - 表示往…

Node 中的path模块

参考文档&#xff1a;https://nodejs.org/docs/latest-v13.x/api/path.html path模块中的常用API&#xff1a; path.basename&#xff1a;获取路径的文件名&#xff0c;默认包含扩展名path.dirname&#xff1a;获取路径中的目录部分path.extname&#xff1a;获取一个路径中的扩…

利用回溯法解决1-9之间添加+或-或使得运算结果为100的问题

问题描述 编写一个在1&#xff0c;2&#xff0c;…&#xff0c;9&#xff08;顺序不能变&#xff09;数字之间插入或-或什么都不插入&#xff0c;使得计算结果总是100的程序&#xff0c;并输出所有的可能性。例如&#xff1a;1 2 34 – 5 67 – 8 9 100。 问题分析 这时…

Atitit。数据库 安全性 重要敏感数据加密存储解决方案

Atitit。数据库 安全性 重要敏感数据加密存储解决方案 1.1. 加密存储的重要性1 1.2. 使用的加密算法aes1 1.3. 数据加密以后会有一些问题。1 1.3.1. 一个是统计&#xff0c;比如统计资金总额。。就无法直接使用sql的sum等数据库内部聚合函数来处理了。。1 1.3.2. 还有一个就是按…

Node中的fs模块

1.fs.stat检测是文件还是目录 2.fs.mkdir创建目录 3.fs.writeFile创建写入文件 4.fs.appendFile追加文件 5.fs.readFile 读取文件 6.fs.readdir读取目录 7.fs.rename重命名 8.fs.rmdir删除目录 9.fs.unlink 删除文件 fs.stat 检测是文件还是目录 const fs require(fs)fs.stat…

主成分分析(PCA)和基于核函数的主成分分析(KPCA)入门

文章目录1 前言2 PCA的原理2.1 什么是投影2.2 投影后的方差2.3 转化为求特征值的问题2.4 符号的表示3 KPCA的原理4 PCA和KPCA在Python中的使用4.1 PCA的使用4.2 KPCA的使用5 参考文献1 前言 主成分分析是在做特征筛选时的重要手段&#xff0c;这个方法在大部分的书中都只是介绍…

算法分类整理+模板①:矩阵快速幂

一直有一个想法&#xff0c;感觉自己很多基础算法不是很扎实&#xff0c;想要找个机会写一些算法的整理&#xff0c;顺便自己总结一些实用的模板。 最近偶然在训练赛中连续做了2道思维矩阵快速幂的题目&#xff0c;碰巧有时间&#xff0c;就以矩阵快速幂作为这个系列博客的开始…

爬虫小记:利用cookies跳过登陆验证码

前言 在爬取某些网页时&#xff0c;登陆界面时经常遇到的一个坎&#xff0c;而现在大多数的网站在登陆时都会要求用户填写验证码。当然&#xff0c;我们可以设计一套机器学习的算法去破解验证码&#xff0c;然而&#xff0c;验证码的形式多种多样&#xff0c;稍微变一下&#…

IOS的 testflight测试设置

管理员邀请参与者 1、登录开发者账号https://developer.apple.com/account 2、进入后&#xff0c;点击ituns connect 3、点击进入用户和职能 4、在用户栏点击添加按钮 5、输入姓名、邮件 6、勾选职能为“开发人员”&#xff0c;选择所要测试或参与研发的APP 7、不用修改&#x…

Nodejs 中的包、npm 、第三方模块、 package.json 以及 cnpm

一、包与 NPM 包Nodejs 中除了它自己提供的核心模块外&#xff0c;我们可以自定义模块&#xff0c;也可以使用第三方的 模块。Nodejs 中第三方模块由包组成&#xff0c;可以通过包来对一组具有相互依赖关系的模块进行 统一管理。 完全符合 CommonJs 规范的包目录一般包含如下…