题解

思路:

翻转0==>1后,需要将周围存在的岛屿的面积做累加。

因此为了方便,我们不在每一次翻转后都去计算一遍岛屿的面积,这样会使得复杂度大幅提升。

可以考虑第一次便利时,我们就将岛屿编号,并记录每个编号岛屿的面积,这样,下次找到岛屿时通过编号可以直接获取面积。

那么问题又来了,如何知道当前格子0附近的岛屿1是哪个编号的岛屿呢?这需要去对原地图进行部分的修改,将原来的岛屿修改为对应的编号,我们做如下修改:

  1. 每个连通的岛屿给不同的编号
  2. 岛屿周围的一圈赋值为-1

因为只翻转一格,所以如果想获得岛屿的最大值,一定是在岛屿周围一圈的格子翻转

  1. 其余格子值不变

修改方式如图所示:

问题就转变为几个小问题了:

  1. 计算每个岛屿的面积并编号。可以利用DFS计算岛屿面积,并通过一个值记录当前岛屿的最大编号,并利用HasMap记录编号岛屿对应的面积。
  2. 转换完成后,遍历寻找-1的格子,找到周围所有不同编号的岛屿,计算面积之和并加1,取最大值。
  3. 考虑极端情况,整个区域都是1,返回结果为n*n;整个区域都为0,返回结果为1

实现代码如下:

public class Solution {private final int[] directionX = {-1,0,1,0};private final int[] directionY = {0,1,0,-1};private int[][] idGrid;private Map<Integer, Integer> id2Area = new HashMap<>();private int n;private int curArea;public int largestIsland(int[][] grid) {//1. 通过DFS给每个岛屿编号,同时计算面积int count = 1;int ans = 0;int n = grid.length;this.n = n;idGrid = new int[n][n];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (grid[i][j] == 1 && idGrid[i][j]==0){// 清空上次岛屿的面积curArea = 0;//计算当前岛屿面积dfs(grid, i, j, count);id2Area.put(count, curArea);count++;ans = Math.max(ans, curArea);  //考虑地图填满的情况,没有0->1的操作空间}}}//在idGrid上做文章,-1的部分为岛屿的边界//0的部分没有用//大于0的部分为岛屿int newX, newY;HashSet<Integer> idSet = new HashSet<>();for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (idGrid[i][j] < 0){//说明四个方向上至少有一个岛屿//可以做以下的统一处理//获取4个方向上岛屿的面积,如果不存在岛屿,面积值设置为0,//把这四个方向上岛屿的面积全部加起来再+1即可//拿到四个岛屿的编号,可能会存在重复的,使用集合idSet.clear();for (int k = 0; k < 4; k++) {newX = i+directionX[k];newY = j+directionY[k];if (newX>=0 && newX<n && newY>=0 && newY<n){idSet.add(idGrid[newX][newY]);}}//把这几个编号的面积全部加上int tempArea = 0;for (Integer id : idSet) {tempArea += (id2Area.getOrDefault(id, 0));}ans = Math.max(ans, tempArea+1);}}}//考虑没有岛屿的情况return ans==0 ? 1:ans;}private void dfs(int[][] grid, int x, int y, int id){idGrid[x][y] = id;curArea++;int newX, newY;for (int i=0; i<4; i++){newX = x+directionX[i];newY = y+directionY[i];if (newX>=0 && newX < n && newY>=0 && newY<n){if(grid[newX][newY] == 1 && idGrid[newX][newY]==0){dfs(grid, newX, newY, id);} else if(grid[newX][newY] == 0) {//岛屿周围做一个标记idGrid[newX][newY] = -1;}}}}}

827. 最大人工岛[DFS+岛屿编号]相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 力扣 827. 最大人工岛

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

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

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

最新文章

  1. android GLSurfaceView渲染模式
  2. 网站性能调优开发工具: Lighthouse, Puppeteer 以及进阶部分丨 Google 开发者大会 2018...
  3. 小工匠聊架构-分布式场景下的并发幂等性常见的解决方案
  4. SpringBoot(笔记)
  5. 将JavaFX 2.0与Swing和SWT集成
  6. add separator in the sessionmenu
  7. JavaEE基础(04):会话跟踪技术,Session和Cookie详解
  8. navicat链接mysql
  9. await Task传异步Lambda问题
  10. java版本号分段比较_java 实现比较版本号功能
  11. nodejs计算时间间隔_nodejs 如何定时执行一个函数
  12. XJOI 3266 Dyeing 染色 题解
  13. 从办公桌可以看透一个人
  14. 数据库系统概念 第五章 习题答案
  15. 基于MATLAB的答题卡识别系统
  16. 程序员和码农有什么差别?
  17. 奈奎斯特与香农定理_奈奎斯特定理和香农定理解析
  18. Win10添加右键菜单以管理员方式打开cmd命令行
  19. 好看的常用背景色RGB数值
  20. 基于属性的访问控制(ABAC)

热门文章

  1. Flask-WTF 示例
  2. 深信服android面试题,2017年深信服Android开发岗位笔试面试总结
  3. Parse 和 TryParse的区别
  4. golang使用sort包排序
  5. Windows 10 LTSB 2016版本,visual studio 2010安装失败!提示Microsoft应用程序错误报告。
  6. 业务模型抽象与业务流程抽象
  7. 企业与团队怎样建立一个有效的、切实可行的知识管理系统?
  8. 英伟达小样本换脸AI:金毛一秒变二哈,还有在线试玩
  9. 计算机网络中属于通信子网,通信子网,计算机网络,互联网三者有什么关系其区..._通信工程师_帮考网...
  10. 经纬度和度分秒之间转换