岛屿问题

  • 200.岛屿问题
  • 1254. 统计封闭岛屿的数目
  • 695. 岛屿的最大面积
  • 1905. 统计子岛屿

力扣上岛屿系列问题。

200.岛屿问题

解题思路:

  1. 利用 DFS(深度优先搜索)根据题意计算岛屿数量。(简单易懂)
  2. DFS 是沿着任意一个单元格上,下, 左, 右 遍历的,不能斜着遍历。
  3. 将计算过的岛屿淹没掉防止重复计算。
class Solution {public int numIslands(char[][] grid) {int m = grid.length, n = grid[0].length; //记录行列int res = 0;//遍历表格,挨着的岛屿为整个岛屿,所以记录完岛屿个数继续调用 DFS 进一步覆盖相邻岛屿for(int i =0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == '1'){res++;dfs(grid,i,j);}}}return res;}public void dfs(char[][]grid, int i, int j){int m = grid.length, n = grid[0].length;if(i < 0 || j < 0 || i >= m || j >= n) return; //超出边界if (grid[i][j] == '0') {// 已经是海水了return;}// 如果是陆地,就淹没陆地。(此时已经记录过这个单元格了)grid[i][j] = '0';// 淹没上下左右的陆地dfs(grid, i + 1, j);dfs(grid, i, j + 1);dfs(grid, i - 1, j);dfs(grid, i, j - 1);}
}

1254. 统计封闭岛屿的数目

解题思路:

  1. DFS
  2. 不同的是这道题求封闭岛屿的数量,我们先把表格外圈土地淹没,剩下的就是封闭岛屿。
class Solution {public int closedIsland(int[][] grid) {int m = grid.length, n = grid[0].length;int res = 0;//遍历表格,先把表格外圈土地淹没,剩下的就是封闭岛屿。for(int j = 0 ; j < n; j++){dfs(grid, 0, j);dfs(grid, m - 1, j);}for(int i = 0 ; i < m; i++){dfs(grid, i, 0);dfs(grid, i, n-1);} // 遍历 grid,剩下的岛屿都是封闭岛屿//挨着的岛屿为整个岛屿,所以记录完岛屿个数继续调用 DFS 进一步覆盖相邻岛屿for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (grid[i][j] == 0) {res++;dfs(grid, i, j);}}}return res;}public void dfs(int[][] grid, int i, int j) {int m = grid.length, n = grid[0].length;if (i < 0 || j < 0 || i >= m || j >= n) {  //超出边界return;}if (grid[i][j] == 1) {// 已经是海水了return;}// 如果是陆地,就淹没陆地。(此时已经记录过这个单元格了)grid[i][j] = 1;// 淹没上下左右的陆地dfs(grid, i + 1, j);dfs(grid, i, j + 1);dfs(grid, i - 1, j);dfs(grid, i, j - 1);
}
}

695. 岛屿的最大面积


解题思路:

  1. DFS
  2. 求最大面积岛屿,对整个表格遍历,不断更新最大值,剩下的和之前一样。
class Solution {public int maxAreaOfIsland(int[][] grid) {// 记录岛屿的最大面积int res = 0;int m = grid.length, n = grid[0].length;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if(grid[i][j] == 1){res = Math.max(res, dfs(grid, i, j)); //记录面积最大的岛屿}}}return res;
}public int dfs(int[][] grid, int i, int j) {int m = grid.length, n = grid[0].length;if (i < 0 || j < 0 || i >= m || j >= n) {// 超出索引边界return 0;}if (grid[i][j] == 0) {// 已经是海水了return 0;}// 如果是陆地,就淹没陆地。(此时已经记录过这个单元格了)grid[i][j] = 0;  //防止重复计算return dfs(grid, i + 1, j) //我们只要知道返回的是面积最大岛屿的数值,剩下的交个 DFS+ dfs(grid, i, j + 1)+ dfs(grid, i - 1, j)+ dfs(grid, i, j - 1) + 1;}
}

1905. 统计子岛屿


解题思路:

  1. DFS
  2. 求两个 grid 重叠的子岛屿。
  3. 忽略 grid2 中是陆地的且 grid1 中是海水的子集,剩下的就是子岛屿
class Solution {public int countSubIslands(int[][] grid1, int[][] grid2) {int m = grid1.length, n = grid1[0].length;int res = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if(grid1[i][j] == 0 && grid2[i][j] == 1)dfs(grid2, i , j); // 除去grid2 中是陆地的且 grid1 中是海水的子集,剩下的就是子岛屿}}// 现在 grid2 中剩下的岛屿都是子岛,计算岛屿数量for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (grid2[i][j] == 1) {res++;dfs(grid2, i, j);}}}return res;}public void dfs(int[][] grid, int i, int j) {int m = grid.length, n = grid[0].length;if (i < 0 || j < 0 || i >= m || j >= n) {return;}if (grid[i][j] == 0) {return;}grid[i][j] = 0;dfs(grid, i + 1, j);dfs(grid, i, j + 1);dfs(grid, i - 1, j);dfs(grid, i, j - 1);}
}

引用:
fucking-algorithm

岛屿问题 (Java) LeeCode相关推荐

  1. 【无标题】Java面向对象第三章知识总结

    1.运算符 *,/,%,++x(--x)表示在使用x之前,先使x的值增(减)1,x++(x--)表示在使用x之后,使x的值增(减)1. 2.运算结果由计算过程中精度的高低决定,结果与精度最高的相同. ...

  2. 物联网工程-hadoop论文

    一 前言 在这一学期的时间里,我们系统地学习了物联网工程专业课和相关的技能课程.这些课程是一个紧密联系.密切相关的一个统一整体.了解课程之间的关系,并运用所学的理论知识解决实际问题,进行综合能力的训练 ...

  3. Leetcode刷题 463题:岛屿的周长(基于Java语言)

    ** Leetcode刷题 463题:岛屿的周长(基于Java语言) ** 一. 题目描述: 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相 ...

  4. insertion Sort List (链表的插入排序) leecode java

    逻辑简单,代码难写,基础不劳,leecode写注释不能出现中文,太麻烦,我写了大量注释,链表问题最重要的就是你那个指针式干啥的 提交地址https://oj.leetcode.com/problems ...

  5. [Leedcode][JAVA][第200题][岛屿数量][DFS][BFS][并查集]

    [问题描述] 第200题 岛屿数量 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量.岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成 ...

  6. LeeCode 算法(Java实现)系列汇总

    LeeCode 算法,使用Java实现,在这里做一个记录. 现在更新到160题,其中绝大部分是简单难度,按通过率从高到低进行学习的. 这部分先告一段落,更新Hot100题库和剑指offer题库,这两个 ...

  7. 岛屿的最大面积(Java)

    给定一个包含了一些 0 和 1 的非空二维数组 grid . 一个岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻.你可以假设 grid 的四 ...

  8. leetcode 1905. 统计子岛屿(C++、java、python)

    给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地).一个 岛屿 是由 四个方向 (水平或者竖直)上相邻的 1 组成的区域.任何矩阵以外的 ...

  9. 岛屿数量JAVA_LeetCode刷题 463. Island Perimeter 岛屿的周长 Java

    LeetCode刷题 463. Island Perimeter 岛屿的周长 Java LeetCode刷题 463. Island Perimeter 岛屿的周长 Java 题目介绍 链接:http ...

最新文章

  1. emqx配置mysql认证_emqx使用mysql完成用户密码验证和ACL鉴权-Go语言中文社区
  2. 【二分图】洛谷P1640连续攻击游戏
  3. Python基础知识点总结
  4. OpenCV C++ 07 - Histogram Equalization of a Color image with OpenCV
  5. linux扩容根目录空间_Linux系统扩容根目录磁盘空间的操作方法
  6. 正则表达式 学习笔记3.4
  7. C++:_ASSERTE(__acrt_first_block == header)
  8. 动态数组ArrayList c# 1613536290
  9. # 根据三边求角度_七年级数学:怎么求旋转射线构成的角度?掌握这种方法口算出结果...
  10. (四)使用TensorFlow和Keras构建AI语言翻译
  11. zend studio 免注册无限试用
  12. python3编码得到中文_Python3的unicode编码转换成中文的问题及解决方案
  13. Chrome插件使用IE tab
  14. 什么是网站前端框架?目前常用的网站前端框架都有哪些?
  15. 逆向Mac版WPS2019解除版本过期限制
  16. C语言 使用DFT得到信号幅度谱
  17. Android开发技巧 (四) —— 多窗口模式
  18. NPS, 校外连接校园网
  19. 数字万用表判断绝缘栅场效应管的好坏
  20. MySQL存储过程、函数、视图、触发器、索引和锁的基本知识

热门文章

  1. The ACM Publishing System (TAPS) ACM出版系统上传文章 操作流程
  2. html5独立钻石棋,独立钻石棋初级入门玩法讲解
  3. 10款常见的Webshell检测工具
  4. Android 出现应用未安装
  5. 机器学习中qa测试_机器学习项目测试怎么做?(看实例)
  6. 微软推超融合基础架构解决方案 企业可在本地端做虚拟化应用
  7. 百度Apollo最新进展:高速自动驾驶、智能自主泊车、车路协同……
  8. 重装纯净版WIN10
  9. c语言程序设计精髓第八章编程题
  10. 中国古代数学家张丘建在他的《算经》中提出了一个著名的 “ 百钱买百鸡问题”鸡翁一, 值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?