图论05-岛屿的最大面积(Java)

5.岛屿的最大面积

  • 题目描述

给你一个大小为 m x n 的二进制矩阵 grid

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0

示例 1:

java 复制代码
输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]
输出:6
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。

示例 2:

java 复制代码
输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0
  • 题目分析
java 复制代码
1.题目要求计算给定二进制矩阵 grid 中最大的岛屿面积,其中岛屿由相邻的1构成,相邻的1必须在水平或竖直方向上相邻。可以假设矩阵边缘被0包围。

2.思路分析
--遍历整个二维矩阵 grid,对每个位置进行如下操作:
--如果当前位置为1,则进行深度优先搜索(DFS)来计算当前岛屿的面积。
--在DFS过程中,将访问过的位置标记为0,并累加岛屿的面积。
--维护一个变量 maxArea 来记录遍历过程中出现的最大岛屿面积,不断更新这个值。
--最终返回 maxArea 即为最大的岛屿面积。
   
3.代码分析
全局变量定义:

max:记录最大岛屿面积。
spare:记录当前岛屿的面积。
maxAreaOfIsland 方法:

遍历整个二维数组 grid,对每个位置进行如下操作:
如果当前位置为1,表示发现一个新的岛屿,调用 dfs 方法计算当前岛屿的面积。
更新 max 为当前最大值,并将 spare(当前岛屿面积)置零。
返回最大岛屿面积 max。
dfs 方法:

深度优先搜索方法,用于计算岛屿的面积。
判断当前位置是否越界,如果越界则返回。
如果当前位置为0,表示没有岛屿,直接返回。
若当前位置为1,增加当前岛屿面积 spare,并将当前位置标记为0,避免重复计算。
递归调用DFS,向上、下、左、右四个方向继续搜索岛屿。
复杂度分析:

时间复杂度:O(m*n),m 和 n 分别为矩阵的行数和列数,需要遍历整个矩阵。
空间复杂度:O(1),除了函数调用栈外,没有使用额外空间。
  • Java代码实现
java 复制代码
class Solution {
    int max = 0;// 岛屿最大面积
    int spare = 0;// 当前岛屿的面积

    public int maxAreaOfIsland(int[][] grid) {
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {// 表示如果岛屿存在
                    dfs(grid, i, j);// 获得一块岛屿的面积
                    max = Integer.max(max, spare);
                    spare = 0;
                }
            }
        }
        return max;
    }

    // 深度优先遍历的方法
    private void dfs(int[][] grid, int i, int j) {
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) {
            return;// 判断所处位置是否越界
        }

        if (grid[i][j] == 0) {
            return;// 当前位置是否存在岛屿
        }

        spare++;// 表明岛屿存在,面积扩大
        grid[i][j] = 0;// 防止重复计算

        dfs(grid, i + 1, j);// 下
        dfs(grid, i - 1, j);// 上
        dfs(grid, i, j + 1);// 右
        dfs(grid, i, j - 1);// 左
    }
}
相关推荐
汉克老师16 分钟前
GESP4级考试语法知识(贪心算法(四))
开发语言·c++·算法·贪心算法·图论·1024程序员节
smj2302_796826521 小时前
用枚举算法解决LeetCode第3348题最小可整除数位乘积II
python·算法·leetcode
爱吃生蚝的于勒1 小时前
C语言最简单的扫雷实现(解析加原码)
c语言·开发语言·学习·计算机网络·算法·游戏程序·关卡设计
hummhumm1 小时前
第 12 章 - Go语言 方法
java·开发语言·javascript·后端·python·sql·golang
hummhumm1 小时前
第 8 章 - Go语言 数组与切片
java·开发语言·javascript·python·sql·golang·database
尼克_张1 小时前
tomcat配合geoserver安装及使用
java·tomcat
wywcool1 小时前
JVM学习之路(5)垃圾回收
java·jvm·后端·学习
-seventy-2 小时前
Java Web 工程全貌
java
秋说2 小时前
【数据结构 | C++】整型关键字的平方探测法散列
数据结构·c++·算法
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
idea 删除本地分支后,弹窗 delete tracked brank
java·ide·intellij-idea