题目描述

给你一个大小为 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的岛屿所在的连通块个数。涉及到将岛屿二维坐标转化为并查集中一维坐标。( 乘所有列数+ 所在列数)。
  2. 合并相连的,就是合并并查集。以一个1岛屿为起点,向四周探寻进行合并,同时在过程中记录最大的岛屿面积。
  3. 寻找水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. 最大人工岛相关推荐

  1. leetcode:827. 最大人工岛【联通分量分组 + 遍历0查看四周】

    分析 思路比较简单 就是找到所有联通分量 然后标个序号 记录每个联通分量的大小 然后遍历每个0的位置,看看四周有多少个不同的联通分量加起来 注意特判全1的情况 Ac code class Soluti ...

  2. Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)

    827. 最大人工岛 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿 ...

  3. Leetcode 827. 最大人工岛 C++

    Leetcode 827. 最大人工岛 题目 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方 ...

  4. Leetcode 827.最大人工岛(Making A Large Island)

    Leetcode 827.最大人工岛 1 题目描述(Leetcode题目链接)   在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的 ...

  5. 岛屿问题 通用解-463.岛屿周长-200.岛屿数量-695.岛屿的最大面积-827.最大人工岛

    文章目录 岛屿问题 如何在网格上做DFS(通用解) 463.岛屿的周长 题目 题解 -通用模板 题解2 200.岛屿数量 题目 题解 695.岛屿的最大面积 题目 题解 827.最大人工岛 题目 题解 ...

  6. 9.18 困难力扣827. 最大人工岛

    827. 最大人工岛 - 力扣(LeetCode) 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 ...

  7. 力扣leetcode 827. 最大人工岛

    文章目录 题目链接与描述 关键词:hash表 方法一: 运行截图 代码 结尾 题目链接与描述 https://leetcode.cn/problems/making-a-large-island/ 给 ...

  8. 图解LeetCode——827. 最大人工岛(难度:困难)

    一.题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上.下.左.右四个方向相连的 1 形 ...

  9. LeetCode 827 最大人工岛 题解

    题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 .返回执行此操作后,grid 中最大的岛屿面积是多少?岛屿 由一组上.下.左.右四个方向相连的 1 形成. 分 ...

  10. LeetCode 827 最大人工岛 C++

    首先DFS遍历"自然"岛的时候,用一个数字位区分每个岛,具体想法是对每个岛进行编号,dfs的同时把1改为当前岛的编号,同时用一个map记录该编号岛的面积. 进入正式流程 遍历矩阵: ...

最新文章

  1. linux 添加动态链接库路径
  2. 图像的评价指标之PSNR——峰值信噪比
  3. MATLAB 表数据结构最终篇,如何实现表操作
  4. 这 17 个 JVM 参数,高级 Java 必须掌握!
  5. 从华为“鸿蒙”备胎看IT项目建设
  6. centos提示找不到netstat 和 ifconfig命令的问题
  7. pid控制从入门到精通pdf_《PID整定指导》白皮书——PID领域的葵花宝典来袭!
  8. php简单的设计模式,MVC,composer
  9. 个人作业-2016.12.2
  10. 案例研究:FIT2CLOUD 飞致云携手联友科技助力东风日产云管平台建设
  11. 天涯社区离线阅读器(实现只看楼主功能)
  12. 免费全景摄影制作教程 - 摄影基础知识
  13. 在群晖上搭建基于 PostgreSQL 的 Joplin Server
  14. 爬虫破解js加密破解(二) 有道词典js加密参数 sign破解
  15. java-IO流-将文件夹以树形结构打印(打印文件夹目录)问题
  16. 我的spfa (= =)!
  17. 华为p20所有权限都打开了,QQ消息依然不弹窗提醒?
  18. 论文研读 Rotated Test Problems for Assessing the Performance of MOEAs
  19. 解决springboot使用多线程无法注入Bean问题,不能注入Service或者Mapper
  20. 2021春 算法复习

热门文章

  1. Apache 模块 mod rewrite RewriteCond 通过检查HTTP REFERER避免
  2. android的单元测试,Android 单元测试(Button 点击测试)
  3. Word+Mathtype的双栏科研论文排版技巧
  4. 九大数据分析方法:相关分析法
  5. 最新环保黑科技智屏来啦,一年省1515度电
  6. 应用分类算法,预测泰坦尼克号乘客幸存结果
  7. 禁用 Windows 远程桌面连接(mstsc)快捷键
  8. 人人API 分享到人人功能 修改版
  9. java在线答疑答题系统
  10. Python 定义一个完整的 vector 类