岛屿问题 (Java) LeeCode
岛屿问题
- 200.岛屿问题
- 1254. 统计封闭岛屿的数目
- 695. 岛屿的最大面积
- 1905. 统计子岛屿
力扣上岛屿系列问题。
200.岛屿问题
解题思路:
- 利用 DFS(深度优先搜索)根据题意计算岛屿数量。(简单易懂)
- DFS 是沿着任意一个单元格上,下, 左, 右 遍历的,不能斜着遍历。
- 将计算过的岛屿淹没掉防止重复计算。
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. 统计封闭岛屿的数目
解题思路:
- DFS
- 不同的是这道题求封闭岛屿的数量,我们先把表格外圈土地淹没,剩下的就是封闭岛屿。
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. 岛屿的最大面积
解题思路:
- DFS
- 求最大面积岛屿,对整个表格遍历,不断更新最大值,剩下的和之前一样。
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. 统计子岛屿
解题思路:
- DFS
- 求两个 grid 重叠的子岛屿。
- 忽略 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相关推荐
- 【无标题】Java面向对象第三章知识总结
1.运算符 *,/,%,++x(--x)表示在使用x之前,先使x的值增(减)1,x++(x--)表示在使用x之后,使x的值增(减)1. 2.运算结果由计算过程中精度的高低决定,结果与精度最高的相同. ...
- 物联网工程-hadoop论文
一 前言 在这一学期的时间里,我们系统地学习了物联网工程专业课和相关的技能课程.这些课程是一个紧密联系.密切相关的一个统一整体.了解课程之间的关系,并运用所学的理论知识解决实际问题,进行综合能力的训练 ...
- Leetcode刷题 463题:岛屿的周长(基于Java语言)
** Leetcode刷题 463题:岛屿的周长(基于Java语言) ** 一. 题目描述: 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相 ...
- insertion Sort List (链表的插入排序) leecode java
逻辑简单,代码难写,基础不劳,leecode写注释不能出现中文,太麻烦,我写了大量注释,链表问题最重要的就是你那个指针式干啥的 提交地址https://oj.leetcode.com/problems ...
- [Leedcode][JAVA][第200题][岛屿数量][DFS][BFS][并查集]
[问题描述] 第200题 岛屿数量 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量.岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成 ...
- LeeCode 算法(Java实现)系列汇总
LeeCode 算法,使用Java实现,在这里做一个记录. 现在更新到160题,其中绝大部分是简单难度,按通过率从高到低进行学习的. 这部分先告一段落,更新Hot100题库和剑指offer题库,这两个 ...
- 岛屿的最大面积(Java)
给定一个包含了一些 0 和 1 的非空二维数组 grid . 一个岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻.你可以假设 grid 的四 ...
- leetcode 1905. 统计子岛屿(C++、java、python)
给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地).一个 岛屿 是由 四个方向 (水平或者竖直)上相邻的 1 组成的区域.任何矩阵以外的 ...
- 岛屿数量JAVA_LeetCode刷题 463. Island Perimeter 岛屿的周长 Java
LeetCode刷题 463. Island Perimeter 岛屿的周长 Java LeetCode刷题 463. Island Perimeter 岛屿的周长 Java 题目介绍 链接:http ...
最新文章
- emqx配置mysql认证_emqx使用mysql完成用户密码验证和ACL鉴权-Go语言中文社区
- 【二分图】洛谷P1640连续攻击游戏
- Python基础知识点总结
- OpenCV C++ 07 - Histogram Equalization of a Color image with OpenCV
- linux扩容根目录空间_Linux系统扩容根目录磁盘空间的操作方法
- 正则表达式 学习笔记3.4
- C++:_ASSERTE(__acrt_first_block == header)
- 动态数组ArrayList c# 1613536290
- # 根据三边求角度_七年级数学:怎么求旋转射线构成的角度?掌握这种方法口算出结果...
- (四)使用TensorFlow和Keras构建AI语言翻译
- zend studio 免注册无限试用
- python3编码得到中文_Python3的unicode编码转换成中文的问题及解决方案
- Chrome插件使用IE tab
- 什么是网站前端框架?目前常用的网站前端框架都有哪些?
- 逆向Mac版WPS2019解除版本过期限制
- C语言 使用DFT得到信号幅度谱
- Android开发技巧 (四) —— 多窗口模式
- NPS, 校外连接校园网
- 数字万用表判断绝缘栅场效应管的好坏
- MySQL存储过程、函数、视图、触发器、索引和锁的基本知识
热门文章
- The ACM Publishing System (TAPS) ACM出版系统上传文章 操作流程
- html5独立钻石棋,独立钻石棋初级入门玩法讲解
- 10款常见的Webshell检测工具
- Android 出现应用未安装
- 机器学习中qa测试_机器学习项目测试怎么做?(看实例)
- 微软推超融合基础架构解决方案 企业可在本地端做虚拟化应用
- 百度Apollo最新进展:高速自动驾驶、智能自主泊车、车路协同……
- 重装纯净版WIN10
- c语言程序设计精髓第八章编程题
- 中国古代数学家张丘建在他的《算经》中提出了一个著名的 “ 百钱买百鸡问题”鸡翁一, 值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?