Leetcode--Java--827. 最大人工岛
题目描述
给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。
返回执行此操作后,grid 中最大的岛屿面积是多少?
岛屿 由一组上、下、左、右四个方向相连的 1 形成。
样例描述
示例 1:输入: grid = [[1, 0], [0, 1]]
输出: 3
解释: 将一格0变成1,最终连通两个小岛得到面积为 3 的岛屿。
示例 2:输入: grid = [[1, 1], [1, 0]]
输出: 4
解释: 将一格0变成1,岛屿的面积扩大为 4。
示例 3:输入: grid = [[1, 1], [1, 1]]
输出: 4
解释: 没有0可以让我们变成1,面积依然为 4。
思路
并查集
整体思路:先确定所有的连通块,然后看是否变成1能够扩大连通块。
- 先初始化并查集,记录以每个1的岛屿所在的连通块个数。涉及到将岛屿二维坐标转化为并查集中一维坐标。( 乘所有列数+ 所在列数)。
- 合并相连的,就是合并并查集。以一个1岛屿为起点,向四周探寻进行合并,同时在过程中记录最大的岛屿面积。
- 寻找水0进行修改,探索四周如果有岛屿1,就能合并起来。这里要注意去重,由于四周的1可能本身就是一个连起来的(要用set去重,就是将公共祖先丢入并查集),最后将set里面的岛屿所在连通块个数相加就是最终面积,不要0改变后本身多了个1。
代码
class Solution { int m, n;int size[], p[];//并查集,查找祖先public int find(int x) {if (p[x] != x) {p[x] = find(p[x]);}return p[x];}//二维坐标转一维public int get(int x, int y) {return x * n + y;}public int largestIsland(int[][] grid) {m = grid.length;n = grid[0].length;size = new int[m * n];p = new int[m * n];int dx[] = new int[]{1, 0, -1, 0};int dy[] = new int[]{0, 1, 0, -1};//初始化并查集for (int i = 0; i < m * n; i ++ ) {p[i] = i;}int maxResult = 0;//初始化各个岛屿for (int i = 0; i < m; i ++ ) {for (int j = 0; j < n; j ++ ) {//是岛屿的情况下if (grid[i][j] == 1) {size[get(i, j)] = 1;maxResult = 1;}}}//合并岛屿 (并查集的合并部分)for (int i = 0; i < m; i ++ ) {for (int j = 0; j < n; j ++ ) {//是岛屿的情况下if (grid[i][j] == 1) {int a = get(i, j);for (int k = 0; k < 4; k ++ ) {int x = i + dx[k], y = j + dy[k];if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) continue;int b = get(x, y);int fa = find(a);int fb = find(b);if (fa != fb) {p[fb] = fa;size[fa] += size[fb];maxResult = Math.max(maxResult, size[fa]);}}}}} //全是0的话,随便改一个if (maxResult == 0) return 1;//改0为1,再进行合并岛屿for (int i = 0; i < m; i ++ ) {for (int j = 0; j < n; j ++ ) {if (grid[i][j] == 1) continue;Set<Integer> set = new HashSet<>();for (int k = 0; k < 4; k ++ ) {int x = i + dx[k], y = j + dy[k];if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) continue;set.add(find(get(x, y)));}int sum = 0;for (int s: set) {sum += size[s];} //加一是加上改变的那个0maxResult = Math.max(maxResult, sum + 1);}}return maxResult;}
}
Leetcode--Java--827. 最大人工岛相关推荐
- leetcode:827. 最大人工岛【联通分量分组 + 遍历0查看四周】
分析 思路比较简单 就是找到所有联通分量 然后标个序号 记录每个联通分量的大小 然后遍历每个0的位置,看看四周有多少个不同的联通分量加起来 注意特判全1的情况 Ac code class Soluti ...
- Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)
827. 最大人工岛 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿 ...
- Leetcode 827. 最大人工岛 C++
Leetcode 827. 最大人工岛 题目 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方 ...
- Leetcode 827.最大人工岛(Making A Large Island)
Leetcode 827.最大人工岛 1 题目描述(Leetcode题目链接) 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的 ...
- 岛屿问题 通用解-463.岛屿周长-200.岛屿数量-695.岛屿的最大面积-827.最大人工岛
文章目录 岛屿问题 如何在网格上做DFS(通用解) 463.岛屿的周长 题目 题解 -通用模板 题解2 200.岛屿数量 题目 题解 695.岛屿的最大面积 题目 题解 827.最大人工岛 题目 题解 ...
- 9.18 困难力扣827. 最大人工岛
827. 最大人工岛 - 力扣(LeetCode) 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 ...
- 力扣leetcode 827. 最大人工岛
文章目录 题目链接与描述 关键词:hash表 方法一: 运行截图 代码 结尾 题目链接与描述 https://leetcode.cn/problems/making-a-large-island/ 给 ...
- 图解LeetCode——827. 最大人工岛(难度:困难)
一.题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上.下.左.右四个方向相连的 1 形 ...
- LeetCode 827 最大人工岛 题解
题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 .返回执行此操作后,grid 中最大的岛屿面积是多少?岛屿 由一组上.下.左.右四个方向相连的 1 形成. 分 ...
- LeetCode 827 最大人工岛 C++
首先DFS遍历"自然"岛的时候,用一个数字位区分每个岛,具体想法是对每个岛进行编号,dfs的同时把1改为当前岛的编号,同时用一个map记录该编号岛的面积. 进入正式流程 遍历矩阵: ...
最新文章
- linux 添加动态链接库路径
- 图像的评价指标之PSNR——峰值信噪比
- MATLAB 表数据结构最终篇,如何实现表操作
- 这 17 个 JVM 参数,高级 Java 必须掌握!
- 从华为“鸿蒙”备胎看IT项目建设
- centos提示找不到netstat 和 ifconfig命令的问题
- pid控制从入门到精通pdf_《PID整定指导》白皮书——PID领域的葵花宝典来袭!
- php简单的设计模式,MVC,composer
- 个人作业-2016.12.2
- 案例研究:FIT2CLOUD 飞致云携手联友科技助力东风日产云管平台建设
- 天涯社区离线阅读器(实现只看楼主功能)
- 免费全景摄影制作教程 - 摄影基础知识
- 在群晖上搭建基于 PostgreSQL 的 Joplin Server
- 爬虫破解js加密破解(二) 有道词典js加密参数 sign破解
- java-IO流-将文件夹以树形结构打印(打印文件夹目录)问题
- 我的spfa (= =)!
- 华为p20所有权限都打开了,QQ消息依然不弹窗提醒?
- 论文研读 Rotated Test Problems for Assessing the Performance of MOEAs
- 解决springboot使用多线程无法注入Bean问题,不能注入Service或者Mapper
- 2021春 算法复习