朋友圈--并查集

2023-10-26

LeetCode

朋友圈

班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。

给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。

示例 1:

输入: 
[[1,1,0],
[1,1,0],
[0,0,1]]
输出: 2 
说明:已知学生0和学生1互为朋友,他们在一个朋友圈。
第2个学生自己在一个朋友圈。所以返回2。

示例 2:

输入: 
[[1,1,0],
[1,1,1],
[0,1,1]]
输出: 1
说明:已知学生0和学生1互为朋友,学生1和学生2互为朋友,所以学生0和学生2也是朋友,所以他们三个在一个朋友圈,返回1。

解法1:并查集

解题思路:

我们用并查集表示每一个朋友圈,一个人就代表一个朋友圈,当我们发现输入的i,j分属两个不同的朋友圈时,我们就将两个朋友圈合并,这就是并查集的解法

class Solution {
    public int findCircleNum(int[][] M) {
        int N = M.length; 
        int[] parent = new int[N];
        Arrays.fill(parent,-1);
        int res = N; //朋友圈的个数首先是所有人的个数,也就是对角线的长度
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++)
                if(M[i][j]==1)
                {
                    if(union_root(i,j,parent)==1) 
                    //两个人不属于同一个朋友圈,那就将两个朋友圈合并,总数减1
                        res--;
                }
        return res;
    }
    public int find_root(int x, int[] parent)
    {
        int x_root = x;
        while(parent[x_root]!=-1)
            x_root = parent[x_root];
        return x_root;
    }
    public int union_root(int x, int y, int[] parent)
    {
        int x_root = find_root(x,parent);
        int y_root = find_root(y,parent);
        if(x_root==y_root)
            return 0;
        parent[x_root] = y_root;
        return 1;
    }
}

时间复杂度为O(n^3) : 因为除了遍历M数组外,我们还需要遍历parent数组,所以复杂度为三次方

空间复杂度为O(N) : parent数组的大小

解法2:dfs

解题思路:

如果我们把输入的矩阵看作一个图,那么连通块的个数就是我们能够进行深搜的次数

public class Solution {
    public void dfs(int[][] M, int[] visited, int i) {
        for (int j = 0; j < M.length; j++) {
            if (M[i][j] == 1 && visited[j] == 0) {
                visited[j] = 1;
                dfs(M, visited, j);
            }
        }
    }
    public int findCircleNum(int[][] M) {
        int[] visited = new int[M.length];
        int count = 0;
        for (int i = 0; i < M.length; i++) {
            if (visited[i] == 0) {
                dfs(M, visited, i);
                count++;
            }
        }
        return count;
    }
}

时间复杂度为O(n^2):遍历一次二维数组
空间复杂度为O(n):visited数组的大小

解法3:bfs

解题思路:

跟深搜是一样的,就是从一个结点出发,访问它能连通的所有结点,当它所有连通结点访问完时,发现还有结点没访问,说明是不连通的,因此朋友圈的个数要增加,总而言之就是换了一种搜索方式

public class Solution {
    public int findCircleNum(int[][] M) {
        int[] visited = new int[M.length];
        int count = 0;
        Queue < Integer > queue = new LinkedList < > ();
        for (int i = 0; i < M.length; i++) {
            if (visited[i] == 0) {
                queue.add(i);
                while (!queue.isEmpty()) {
                    int s = queue.remove();
                    visited[s] = 1;
                    for (int j = 0; j < M.length; j++) {
                        if (M[s][j] == 1 && visited[j] == 0)
                            queue.add(j);
                    }
                }
                count++;
            }
        }
        return count;
    }
}

复杂度是一样的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

朋友圈--并查集 的相关文章

随机推荐

  • Tensorboard不加载所有数据点的解决方案

    使用下面代码读取tensorboard保存文件中的数据 部分数据点未加载出来 导入tensorboard的事件解析器 from tensorboard backend event processing import event accumu
  • 目录下的文件

    1 先帖一个 ArrayList循环的使用方式 region 显示表格
  • 逢泽莉娜2

    http www topit me item 3734409 albums http www incoto net read php tid 714474 fpage 44 html
  • 总论:认识大数据挖掘

    数据挖掘 有人说 大数据是新时代的黄金和石油 掌握了它 就掌握了新经济的命脉 用好了它 就拥有了新战略型资源 数据挖掘 就是从大量的 不完全的 有噪声的 模糊的 随机的实际应用数据中 提取隐含在其中的 人们实事先不知道的 但又是潜在有用的信
  • HTML绝对路径问题

    绝对路径 是指目录下的绝对位置 zhi 直接到达的目标位置 通常是从盘符开始的路径 我在使用这个绝对路径时 发现谷歌浏览器或其他的浏览器都不能加载图片 图片在路径中是真实存在的 在使用相对路径时 图片可以正常的加载出来 但是 这个绝对路径可
  • selenium定位弹框元素

    selenium定位弹窗元素 一 弹出框是alert类型 selenium提供switch to alert方法 捕获弹出对话框 可以定位alert confirm prompt对话框 alert switch to alert alter
  • Prompt是什么意思?

    1 Prompt是什么意思 Prompt是 PRedictive OPTimization with Machine Learning 的缩写 翻译成中文为 机器学习预测优化 它是一种自然语言处理技术 能够自动生成人类语言式的文本 例如问题
  • 毕业论文参考文献格式-工科

    问题描述 参考文献是我们毕业论文中重要的组成部分 其格式有和严格的要求 我国毕业论文现行使用的是国标7714 2005 手动的调整参考文献格式不仅会耗费很多的时间和精力 当我们的论文内容有所改动时 参考文献会有所变动 格式也会随机发生变化
  • Mac格式化移动硬盘DiskUtil

    可以使用如下命令 diskutil list dev disk4 external physical TYPE NAME SIZE IDENTIFIER 0 GUID partition scheme 4 0 TB disk4 1 EFI
  • django开发电子商城(三)django内置分页

    1 更新数据库表 修改models py中的Product类 运行命令 完成数据库更新 2 在admin界面增加相关数据 3 编辑列表函数 views py 增加分页功能 4 增加路由 编辑urls py
  • .net5 不支持winform_深度探秘.NET 5.0

    2020 中国 NET 开发者峰会正式启动 欢迎大家提交演讲主题或者购买超级早鸟票 今年11月10号 NET 5 0 如约而至 这是 NET All in one后的第一个版本 虽然不是LTS Long term support 版本 但是
  • 递推与递归

    递推 例一 仅展示核心代码 int main cin gt gt N Bigint f 5010 f 1 Bigint 1 f 2 Bigint 2 for int i 3 i lt N i f i f i 2 f i 1 f N prin
  • JSON.parse()与JSON.stringify()的区别

    json stringfy 将对象 数组转换成字符串 json parse 将字符串转成json对象 json stringfy 语法 JSON stringify value replacer space 参数 value 是必选字段 就
  • vue项目3-通过与拒绝审核

    这样的需求 点击拒绝审核状态变为审核不通过 反之为审核通过 首先进行数据处理 显示当前内容特别注意 给每一项添加 examine 属性 让其随着status改变而改变 这也为之后调用接口改变status进而改变examine埋下了伏笔 上面
  • 归并算法详解

    归并算法的本质是将待排序序列分为两部分 依次对分得的两个部分再次使用归并排序 之后再对其进行合并 接下来对待排序列A 0 A 1 A 2 A n 1 用归并排序思想进行排序 算法实现 1 将序列分为两部分 其中一部分对应的索引区间为 sta
  • springboot整合mybatis将sql打印到日志

    在前台请求数据的时候 sql语句一直都是打印到控制台的 有一个想法就是想让它打印到日志里 该如何做呢 见下面的mybatis配置文件
  • 计算机网络的种种

    以太网帧结构 类型为0x0800时 表示网络层使用的是IP协议 以太网传送数据时 每两个帧之间存在帧间隙IFG Inter Frame Gap 或者说IPG Inter Packet Gap 帧间隙的作用是使介质中的信号处于稳定状态 同时让
  • Linux系统Conda安装paddle-GPU后出现The third-party dynamic library (libcudnn.so) 报错

    在Linux系统下 使用conda环境安装GPU版本的Paddle 安装后使用官方检测程序python c import paddle paddle utils run check 检测GPU是否工作正常 出现如下报错 The third
  • uniapp小程序上传图片裁剪效果demo(整理)

  • 朋友圈--并查集

    LeetCode 朋友圈 班上有 N 名学生 其中有些人是朋友 有些则不是 他们的友谊具有是传递性 如果已知 A 是 B 的朋友 B 是 C 的朋友 那么我们可以认为 A 也是 C 的朋友 所谓的朋友圈 是指所有朋友的集合 给定一个 N N