LeetCode 827 最大人工岛 题解
题目
给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。返回执行此操作后,grid 中最大的岛屿面积是多少?岛屿 由一组上、下、左、右四个方向相连的 1 形成。
分析
经典的图论中连同分量的题目。包含的知识点:
- 基本DFS 框架,marked辅助数组
- 连通分量个数统计:每次dfs返回 做一次统计
- 标识节点属于哪个连通分量
- 每个连通分量的大小
- 本题将一格变成1,把岛屿连接起来,要注意一格将两个方向的岛屿连接起来的时候,这两个方向上的有可能是同一个岛屿,不要重复累加
算法
- dfs 遍历
这一步统计出每个岛屿大小,标记出每个格子所属的岛屿 - 连接
累加一个格子变成1以后可以连接起来的岛屿总大小,注意不同方向上接壤的岛屿可能是同一个岛屿
代码
class Solution {public int largestIsland(int[][] grid) {marked = new int[grid.length][grid[0].length];for (int[] row : marked) {Arrays.fill(row, -1);}int maxIsland = 0;for (int i = 0; i < grid.length; ++i) {for (int j = 0; j < grid[i].length; ++j) {if (grid[i][j] == 0 || marked[i][j] >= 0) continue;dfs(i, j, grid);isLands.add(curSize);maxIsland = Math.max(maxIsland, curSize);curSize = 0;}}int maxSize = 0;for (int i = 0; i < grid.length; ++i) {for (int j = 0; j < grid[i].length; ++j) {if (grid[i][j] == 1) continue;Map<Integer, Integer> includes = new HashMap<>();int[][] dirs = new int[][] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};for (int[] dir : dirs) {int ii = i + dir[0];int jj = j + dir[1];if (ii >= 0 && ii < grid.length && jj >= 0 && jj < grid[ii].length && marked[ii][jj] != -1) {includes.put(marked[ii][jj], isLands.get(marked[ii][jj]));}}int size = 1;for (Map.Entry<Integer, Integer> e : includes.entrySet()) {size += e.getValue();}maxSize = Math.max(maxSize, size);}}return maxSize == 0 ? maxIsland : maxSize;}private void dfs(int i , int j, int[][] grid) {marked[i][j] = isLands.size();++ curSize;int[][] dirs = new int[][] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};for (int[] dir : dirs) {int ii = i + dir[0];int jj = j + dir[1];if (ii >= 0 && ii < grid.length && jj >= 0 && jj < grid[ii].length&& grid[ii][jj] == 1 && marked[ii][jj] == -1) {dfs(ii, jj, grid);}}}private int curSize = 0;private ArrayList<Integer> isLands = new ArrayList<>();private int[][] marked;
}
LeetCode 827 最大人工岛 题解相关推荐
- Leetcode 827. 最大人工岛 C++
Leetcode 827. 最大人工岛 题目 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方 ...
- Leetcode 827.最大人工岛(Making A Large Island)
Leetcode 827.最大人工岛 1 题目描述(Leetcode题目链接) 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的 ...
- Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)
827. 最大人工岛 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿 ...
- 力扣leetcode 827. 最大人工岛
文章目录 题目链接与描述 关键词:hash表 方法一: 运行截图 代码 结尾 题目链接与描述 https://leetcode.cn/problems/making-a-large-island/ 给 ...
- 图解LeetCode——827. 最大人工岛(难度:困难)
一.题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上.下.左.右四个方向相连的 1 形 ...
- LeetCode 827 最大人工岛 C++
首先DFS遍历"自然"岛的时候,用一个数字位区分每个岛,具体想法是对每个岛进行编号,dfs的同时把1改为当前岛的编号,同时用一个map记录该编号岛的面积. 进入正式流程 遍历矩阵: ...
- LeetCode 827题 最大人工岛
LeetCode 827题 也是递归 class Solution {boolean isChanged = false;int count = 0;int resNum = 0;Map<Int ...
- 岛屿问题 通用解-463.岛屿周长-200.岛屿数量-695.岛屿的最大面积-827.最大人工岛
文章目录 岛屿问题 如何在网格上做DFS(通用解) 463.岛屿的周长 题目 题解 -通用模板 题解2 200.岛屿数量 题目 题解 695.岛屿的最大面积 题目 题解 827.最大人工岛 题目 题解 ...
- 9.18 困难力扣827. 最大人工岛
827. 最大人工岛 - 力扣(LeetCode) 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 ...
最新文章
- 李飞飞AI100报告提出14大AI机遇与挑战(附pdf)
- 坐在隔壁的00后同事,让我看到了职场“反内卷”的希望
- Ubuntu文件的复制、移动和删除命令
- UIImagePikerController 浅析
- 详解spl_autoload_register()函数
- Django 模型 —— 模型介绍
- pfSense Book下载
- super 和 this 关键字的比较+调用构造器(this)+动态绑定
- 多媒体计算机的关键技术有哪些,多媒体计算机的定义分类和关键技术
- 专治月薪不过万的副业大全
- Java专项面试训练(一)
- carmaker/matlab联合仿真(三) 生成车道线点,拟合多项式方程
- 计算机辅助翻译 火云译客,中文在线翻译韩语
- 主板怎么开启csm_B460主板BIOS设置CSM选项无法开启的解决方法
- 解决Ubuntu16.04 wineQQ和wps office 不能输入中文的问题
- Mac电脑CPU、风扇转速、电池电量等硬件参数监控免费小插件-iStats
- oracle调优(1)
- 另一个伊甸 更新进度 23-01-27
- 微服务系列笔记之Mico Api详解
- 千山独行-一个人的创业路(连载一)
热门文章
- 1、Android单元测试
- Navicat链接数据库奇葩错误
- AcWing 826. 单链表
- 【品牌推广公司】品牌营销,奇龙十三哥浅谈如何进行有效的口碑传播
- win10 docker无法启动nginx 443端口被占用
- 遥感影像分类、目标检测、语义分割、实例分割的异同
- twilio php 发送短信,php - PHP,Twilio SMS-捕获twilio的响应 - SO中文参考 - www.soinside.com...
- 敌人的敌人是朋友:苹果欲联手Google干掉Amazon?
- canvas绘制图片,图片变模糊
- √[ (11^4+100^4+111^4)÷2]的开根号算法