图论06-【无权无向】-图的遍历并查集Union Find-力扣695为例

文章目录

  • 1. 代码仓库
  • 2. 思路
    • 2.1 UF变量设计
    • 2.2 UF合并两个集合
    • 2.3 查找当前顶点的父节点 find(element)
  • 3. 完整代码

1. 代码仓库

https://github.com/Chufeng-Jiang/Graph-Theory

2. 思路

2.1 UF变量设计

在这里插入图片描述

parent数组保存着每个节点所指向的父节点的索引,初始值为当前顶点编号,指向自己。

后期在合并的时候均指向其合并的另一个元素的父节点,也就是p->a, q->q,合并p和q时,改变q的指向,q->a.

最终a下面挂两个节点,分别为p, q.

//parent数组中保存着每个节点所指向的父节点的索引
private int[] parent;sz数组来保存每个根节点所代表的子树中元素的数量 
private int[] sz;

2.2 UF合并两个集合

查找两个元素的父节点,父节点相同则属于同一个集合

public void unionElements(int p, int q) {int pRoot = find(p); // 找到p的父节点int qRoot = find(q); // 找到q的父节点if (pRoot == qRoot) // 如果pq的父节点相同,说明在同一个集合内return;parent[pRoot] = qRoot; //如果不相同,将p的父节点挂到q的父节点下,进行合并sz[qRoot] += sz[pRoot]; //q的集合大小合并
}

2.3 查找当前顶点的父节点 find(element)

递归查找父节点,只要不满足p = parent[p],就肯定没有到达最上层。find(parent[p])为查找p节点的

public int find(int p) {if (p != parent[p]) //还没找到根节点parent[p] = find(parent[p]); //递归实现//p = parent[p]时,就是父节点return parent[p]; 
}

在这里插入图片描述

3. 完整代码

public class Union_Find {class UF {private int[] parent; //parent数组中保存着每个节点所指向的父节点的索引private int[] sz;public UF(int n) {parent = new int[n];sz = new int[n];for (int i = 0; i < n; i++) {parent[i] = i; //初始化的时候当前节点的父节点都是自己sz[i] = 1; //当前所属集合的大小}}// 不断去查询自己的父亲节点, 直到到达根节点// 根节点的特点: parent[p] == ppublic int find(int p) {if (p != parent[p]) //还没找到根节点parent[p] = find(parent[p]); //递归实现return parent[p]; //终于找到根节点}public boolean isConnected(int p, int q) {return find(p) == find(q);}public void unionElements(int p, int q) {int pRoot = find(p); //找到p的父节点int qRoot = find(q); //找到q的父节点if (pRoot == qRoot)//如果pq的父节点相同,说明在同一个集合内return;parent[pRoot] = qRoot; //如果不相同,将p的父节点挂到q的父节点下,进行合并sz[qRoot] += sz[pRoot]; //q的集合大小合并}public int size(int p) {return sz[find(p)];}}private int[][] dirs = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};private int R, C;public int maxAreaOfIsland(int[][] grid) {if (grid == null) return 0;R = grid.length;if (R == 0) return 0;C = grid[0].length;if (C == 0) return 0;UF uf = new UF(R * C);for (int v = 0; v < R * C; v++) {int x = v / C, y = v % C;if (grid[x][y] == 1)for (int d = 0; d < 4; d++) {int nextx = x + dirs[d][0], nexty = y + dirs[d][1];if (inArea(nextx, nexty) && grid[nextx][nexty] == 1) {int next = nextx * C + nexty;uf.unionElements(v, next);}}}int res = 0;for (int v = 0; v < R * C; v++) {int x = v / C, y = v % C;if (grid[x][y] == 1)res = Math.max(res, uf.size(v)); //遍历找到最大的size}return res;}private boolean inArea(int x, int y) {return x >= 0 && x < R && y >= 0 && y < C;}
}

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

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

相关文章

uniapp实现登录组件之外区域置灰并引导登录

实现需求 每个页面需要根据用户是否登录决定是否显示登陆组件,登录组件半屏底部显示,登录组件之外区域置灰,功能按钮点击之后引导提示登录.页面效果如下: 实现思路说明 设置登录组件背景颜色为灰色,将页面分成登录区域(底部)和非登陆区域(上面灰色显示部分), 置灰区域添加…

flink中使用GenericWriteAheadSink的优缺点

背景 GenericWriteAheadSink是flink中提供的实现几乎精确一次输出的数据汇抽象类&#xff0c;本文就来看一下使用GenericWriteAheadSink的优缺点 GenericWriteAheadSink的优缺点 先看一下GenericWriteAheadSink的原理图 优点&#xff1a; 几乎可以精确一次的输出&#xf…

【LeetCode】94. 二叉树的中序遍历 [ 左子树 根结点 右子树 ]

题目链接 文章目录 Python3方法一&#xff1a; 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二&#xff1a; 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三&#xff1a; Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯ C…

【Java】<泛型>,在编译阶段约束操作的数据结构,并进行检查。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ JAVA泛型 泛型介绍&#xff1a; ①泛型&#…

一、软件工程概述+练习题

文章目录 软件工程复习一、 概述1.常见考点1.1 什么是软件&#xff1f;软件的特点 1.2 什么是软件危机&#xff1f;它的具体表现是什么&#xff1f;软件危机的概念软件危机的内容具体表现软件危机的原因消除软件危机的途径 2.软件工程的三要素软件工程的定义 3. 软件生存周期4.…

高校教务系统登录页面JS分析——西安交通大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

小插曲 -- 使用Visual Studio Code远程连接香橙派

在之前的学习中&#xff0c;代码的修改和保存都依赖于“vi”指令&#xff0c;而不得不承认vi指令的编辑界面非常原始&#xff0c;所以&#xff0c;如果可以将代码编辑放到更友好的环境里进行无疑是一件大快人心的事情。 本节介绍如何通过Visual Studio Code来进行远程连接: Vi…

Mybatis的SqlRunner执行流程

Mybatis的SqlRunner执行流程 SqlRunner exec new SqlRunner(connection); Map<String, Object> row exec.selectOne("SELECT * FROM PRODUCT WHERE PRODUCTID ?", "FI-SW-01");connection.close();assertEquals("FI-SW-01", row.ge…

strcpy函数

文章目录 strcpy函数描述函数使用总结目标空间为什么必须可变&#xff1f;模拟实现 strcpy函数描述 重点&#xff1a;including the terminating null character (and stopping at that point).意为拷贝的值包括停止字符 传参时第一个参数为要拷贝参数&#xff0c;第二个参数为…

springMVC中统一异常处理@ControllerAdvice

1.在DispatcherServlet中初始化HandlerExceptionResolver 2.controller执行完成后执行processDispatchResult(processedRequest,response,mappedHandler,mv,dispatchException),有异常则处理异常 3.ExcepitonHandlerExceptionResolver中执行方法doResolveHandlerMethodExceptio…

【vSphere 8 自签名 VMCA 证书】企业 CA 签名证书替换 vSphere VMCA CA 证书Ⅰ—— 生成 CSR

目录 替换拓扑图证书关系示意图说明 & 关联博文1. 默认证书截图2. 使用 certificate-manager 生成CSR2.1 创建存放CSR的目录2.2 记录PNID和IP2.3 生成CSR2.4 验证CSR 参考资料 替换拓扑图 证书关系示意图 本系列博文要实现的拓扑是 说明 & 关联博文 因为使用企业 …

Linux tmux使用总结

文章目录 1 tmux介绍2 tmux概念会话Sessions、窗口Windows、面板Panesstatus line中字段含义 3 Sessions会话管理新建会话断开当前会话进入之前的会话关闭会话查看所有的会话 4 tmux快捷指令系统指令窗口&#xff08;Windows&#xff09;指令面板&#xff08;Panes&#xff09;…