分析

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

Ac code

class Solution:def largestIsland(self, grid: List[List[int]]) -> int:group = 2# 不同联通分量标志不同序号n = len(grid)visit = [[False] * n for _ in range(n)]# 记录不同序号的联通分量大小d = defaultdict(int)#cnt = 0def dfs(x, y, groupId):nonlocal cntcnt += 1visit[x][y] = Truegrid[x][y] = groupIdfor nx, ny in ((x + 1, y), (x - 1, y), (x, y - 1), (x, y + 1)):if 0 <= nx < n and 0 <= ny < n and grid[nx][ny] == 1 and visit[nx][ny] is False:dfs(nx, ny, groupId)for i in range(n):for j in range(n):if visit[i][j] is False and grid[i][j] == 1:cnt = 0dfs(i, j, group)                  d[group] = cntgroup += 1# 找0#print(grid)ans = 1flag = Falsefor i in range(n):for j in range(n):if grid[i][j] == 0:flag = Truecnt = 1s = set()for ni, nj in ((i + 1, j), (i - 1, j), (i, j - 1), (i, j + 1)):if 0 <= ni < n and 0 <= nj < n:if grid[ni][nj] >= 2 and grid[ni][nj] not in s:cnt += d[grid[ni][nj]]s.add(grid[ni][nj])ans = max(ans, cnt)if flag:return anselse:return n * n

总结

联通分量的应用

java解析

class Solution {// i 和 i + 1匹配 四个方向static int[] d = {0, -1, 0, 1, 0};public int largestIsland(int[][] grid) {int n = grid.length, res = 0;// 打标签int[][] tag = new int[n][n];Map<Integer, Integer> area = new HashMap<Integer, Integer>();for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {// 看联通分量暂无标签if (grid[i][j] == 1 && tag[i][j] == 0) {// 一个独特的标签int t = i * n + j + 1;// 标签 -> 具体的个数area.put(t, dfs(grid, i, j, tag, t));// 最大的联通分量res = Math.max(res, area.get(t));}}}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {// 可以变的点if (grid[i][j] == 0) {int z = 1;// 保证联通分量不重复Set<Integer> connected = new HashSet<Integer>();for (int k = 0; k < 4; k++) {int x = i + d[k], y = j + d[k + 1];if (!valid(n, x, y) || tag[x][y] == 0 || connected.contains(tag[x][y])) {continue;}z += area.get(tag[x][y]);// 记下这个标签connected.add(tag[x][y]);}res = Math.max(res, z);}}}return res;}public int dfs(int[][] grid, int x, int y, int[][] tag, int t) {// 同一个联通分量打上同一个标签int n = grid.length, res = 1;tag[x][y] = t;for (int i = 0; i < 4; i++) {int x1 = x + d[i], y1 = y + d[i + 1];if (valid(n, x1, y1) && grid[x1][y1] == 1 && tag[x1][y1] == 0) {res += dfs(grid, x1, y1, tag, t);}}return res;}// x y 在合理的范围内public boolean valid(int n, int x, int y) {return x >= 0 && x < n && y >= 0 && y < n;}
}

思路跟我的一样
java数组好像是用引用传递的 所以tag数组可以在函数内更新

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

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

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

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

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

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

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

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

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

  5. LeetCode 827 最大人工岛 题解

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

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

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

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

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

  8. LeetCode 827题 最大人工岛

    LeetCode 827题 也是递归 class Solution {boolean isChanged = false;int count = 0;int resNum = 0;Map<Int ...

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

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

最新文章

  1. 做出的C++选择以及背后的原因
  2. hadoop3.2.0集群搭建的一些坑!
  3. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
  4. 在SAP WebClient UI里使用AJAX进行异步数据读取
  5. ubuntu20.04使用终端命令安装谷歌Chrome浏览器稳定版
  6. coco showanns不显示_coco奶茶加盟好不好?【5月官网最新公布】加盟费用+加盟流程...
  7. 删除共享内存_进程通信专题之 共享内存
  8. 95-290-040-源码-内存管理-MemorySegment
  9. nagios插件脚本check_linux_stats.pl 安装
  10. 状态(State)模式
  11. MS Expression Web中的Asp.net mvc(和其他网络编辑工具)
  12. python判断图片是不是火车票_12306验证码图像识别程序源码-Python识别12306验证码 - PS下...
  13. python syntax error_python提示Syntax Error报错解决教程
  14. Maven当中resources标签的用法
  15. indexedDB存储
  16. 字典类型用于表示一维和二维数据?
  17. 微信公众号菜单点击发送天气预报
  18. Flutter 实现背景图片毛玻璃效果
  19. 新款任天堂Switch《游戏机专业投屏充电底座带网口方案》LDR6023B+AX88179
  20. select: Invalid argument

热门文章

  1. 微软将于10月5日推出Office 2021,与Windows 11同年同月同日生
  2. Oracle与MySQL数据库大型对象类型(TinyBlob Blob Mediumblob LongBlob / BLOB CLOB NCLOB BFILE )的区别
  3. 计算机的发展导致消失的职业,未来20年“6成”职业或消失!会影响哪些专业?...
  4. CSS 手写加号和减号
  5. 数据库SQL实战(牛客网):查找入职时间倒数第三晚的员工所有信息
  6. 原生JS的canvas标签画时钟
  7. 串行通信口防雷电路设计参考
  8. Masscan扫描器安装和使用
  9. togglebutton用法 java_ToggleButton 基本使用方法
  10. KOOCAN小教程,制作万圣节食物,最后一个吓坏我了!!