Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)
827. 最大人工岛
在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地。
进行填海之后,地图上最大的岛屿面积是多少?(上、下、左、右四个方向相连的 1 可形成岛屿)
示例 1:
输入: [[1, 0], [0, 1]]
输出: 3
解释: 将一格0变成1,最终连通两个小岛得到面积为 3 的岛屿。
示例 2:
输入: [[1, 1], [1, 0]]
输出: 4
解释: 将一格0变成1,岛屿的面积扩大为 4。
示例 3:
输入: [[1, 1], [1, 1]]
输出: 4
解释: 没有0可以让我们变成1,面积依然为 4。
说明:
1 <= grid.length = grid[0].length <= 50
0 <= grid[i][j] <= 1
PS:
DFS把岛屿拿出来,每个岛屿放上不同的标记
然后,把每个岛屿的面积放进数组存上,
然后再找每一个海洋,看看要是能把当前海洋变成陆地,组成的最大的面积是多少记录一下
class Solution {public int largestIsland(int[][] grid) {int[] map = new int[grid.length*grid[0].length/2+3];int index = 2;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == 1) {fullIsland(grid, i, j, index++);}}}for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] > 0) {map[grid[i][j]]++;}}}int max = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == 0) {int t = 1,t1=0,t2=0,t3=0,t4=0;if (i > 0 && (t1 = grid[i - 1][j]) > 1) {t += map[t1];}if (i < grid.length - 1 && (t2 = grid[i + 1][j]) > 1 && t2 !=t1) {t += map[t2];}if (j > 0 && (t3 = grid[i][j - 1]) > 1 && t2 !=t3 && t1 !=t3) {t += map[t3];}if (j < grid[0].length - 1 && (t4 = grid[i][j + 1]) > 1 && t4 != t3 && t2 != t4 && t1 != t4) {t += map[t4];}max = Math.max(max, t);}}}if (max == 0) {if (grid[0][0] == 0) {return 1;} else {return grid.length*grid[0].length;}}return max;}public void fullIsland(int[][] grid, int i, int j, int index) {grid[i][j] = index;if (i > 0 && grid[i - 1][j] == 1) {fullIsland(grid, i - 1, j, index);}if (i < grid.length - 1 && grid[i + 1][j] == 1) {fullIsland(grid, i + 1, j, index);}if (j > 0 && grid[i][j - 1] == 1) {fullIsland(grid, i, j - 1, index);}if (j < grid[0].length - 1 && grid[i][j + 1] == 1) {fullIsland(grid, i, j + 1, index);}}
}
Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)相关推荐
- Java实现 LeetCode 808 分汤 (暴力模拟)
808. 分汤 有 A 和 B 两种类型的汤.一开始每种类型的汤有 N 毫升.有四种分配操作: 提供 100ml 的汤A 和 0ml 的汤B. 提供 75ml 的汤A 和 25ml 的汤B. 提供 5 ...
- Java实现 LeetCode 799 香槟塔 (暴力模拟)
799. 香槟塔 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了 ...
- Leetcode 827.最大人工岛(Making A Large Island)
Leetcode 827.最大人工岛 1 题目描述(Leetcode题目链接) 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的 ...
- Leetcode 827. 最大人工岛 C++
Leetcode 827. 最大人工岛 题目 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方 ...
- 力扣leetcode 827. 最大人工岛
文章目录 题目链接与描述 关键词:hash表 方法一: 运行截图 代码 结尾 题目链接与描述 https://leetcode.cn/problems/making-a-large-island/ 给 ...
- LeetCode 827 最大人工岛 题解
题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 .返回执行此操作后,grid 中最大的岛屿面积是多少?岛屿 由一组上.下.左.右四个方向相连的 1 形成. 分 ...
- 827. 最大人工岛[DFS+岛屿编号]
题解 思路: 翻转0==>1后,需要将周围存在的岛屿的面积做累加. 因此为了方便,我们不在每一次翻转后都去计算一遍岛屿的面积,这样会使得复杂度大幅提升. 可以考虑第一次便利时,我们就将岛屿编号, ...
- LeetCode 827 最大人工岛 C++
首先DFS遍历"自然"岛的时候,用一个数字位区分每个岛,具体想法是对每个岛进行编号,dfs的同时把1改为当前岛的编号,同时用一个map记录该编号岛的面积. 进入正式流程 遍历矩阵: ...
- 图解LeetCode——827. 最大人工岛(难度:困难)
一.题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上.下.左.右四个方向相连的 1 形 ...
最新文章
- 视频分享网站首页:最新视频特效
- MongoDB应用场景
- macos安装homebrew
- 文巾解题 1433. 检查一个字符串是否可以打破另一个字符串
- springboot使用原生servlet、filter、listener
- python如何进阶提升_Python序列操作之进阶篇
- Spark SQL(一)之简介
- css高度已知,左右定宽,中间自适应三栏布局
- C++vector相关学习,我的理解
- oracle打开文件模式无效,oracle expdp导入时 提示“ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 ”...
- 工业互联网方案商“全应科技”获明势领投Pre-A轮融资
- python getcwd_Python os.getcwd()方法
- 解决UE4官方文档C++API查询慢问题
- qq登录界面及其实现
- Zemax操作41--公差分析(一)
- VMware虚拟机安装Win10
- z-blogPHP在西部数码虚拟主机上遇到WTS-WAF错误拦截情况,协商好久他们还是妥协了...
- 学生信息管理系统(PHP)
- 斑马条码打印机常见故障大盘点
- Android 编译之make基础(转)