LeetCode0695-海岛岛屿最大面积

该博客介绍了如何使用深度优先搜索(DFS)算法解决在二维矩阵中寻找最大岛屿面积的问题。博主首先解释了岛屿的定义,然后详细阐述了如何通过DFS遍历矩阵并更新每个岛屿的面积,同时避免重复计算。最后,博主提供了完整的Java代码实现,并展示了如何遍历矩阵以找到最大岛屿面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度搜索

经典之海岛岛屿

题目

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

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

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

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

题解

注意,要我们计算的是最大的海岛岛屿面积,而不是这篇区域的面积和

我们先一步步来,首先对于每一点,我们要怎么进行上下左右的搜索呢?

    //public static void dfs(地图,坐标x,坐标y)
    public static void dfs(int[][] grid,int _x,int _y){
        //老规矩,判断
        if(_x<0 || _y<0 || _x>=grid.length || _y >=grid[0].length){
            return  ;
            //越界自然是不行的
        }

        if(grid[_x][_y] ==0){
            return ;
            //是海的话,我们也不要进行什么操作
        }

        grid[_x][_y] = 0 ; //更改属性(地->海),避免重复计算

        dfs(gird,_x+1,_y);
        dfs(gird,_x-1,_y);
        dfs(gird,_x,_y+1);
        dfs(gird,_x,_y-1);
    }

好的,现在我们回过头来看,我们需要的是最大岛屿面积
思路很简单,算出每个小岛屿的面积和即可,然后不断比较更新最大值

    int max = 0 ; 
    Math.max(max,每个岛屿的面积);

因此我们改造以下dfs函数,使它可以返回每一个岛屿的面积

    public static int dfs(int[][] grid, int _x, int _y){
        if(_x<0 || _y<0 || _x>=grid.length || _y >=grid[0].length){
            return 0 ;
        }

        if(grid[_x][_y] ==0){
            return 0 ;
        }

        //是陆地的话就对周围计数
        int count = 1 ;
        grid[_x][_y] = 0 ;
        count += dfs(grid,_x+1,_y);
        count += dfs(grid,_x,_y+1);
        count += dfs(grid,_x-1,_y);
        count += dfs(grid,_x,_y-1);

        return count ;

    }

然后我们遍历地图,就可以求得最大值

        int max =  0 ;
        //遍历比较
        for(int i = 0 ; i<grid.length;i++){
            for(int j = 0 ; j <=grid[0].length ; j++){
                max = Math.max(max,dfs(grid,i,j));
            }
        }

完整的代码如下:

class Solution {
    public int maxAreaOfIsland(int[][] grid) {
        int max =  0 ;
        //遍历比较
        for(int i = 0 ; i<grid.length;i++){
            for(int j = 0 ; j <=grid[0].length ; j++){
                max = Math.max(max,dfs(grid,i,j));
            }
        }


        return max ; 
    }

    public static int dfs(int[][] grid, int _x, int _y){
        if(_x<0 || _y<0 || _x>=grid.length || _y >=grid[0].length){
            return 0 ;
        }

        if(grid[_x][_y] ==0){
            return 0 ;
        }

        int count = 1 ;
        grid[_x][_y] = 0 ;
        count += dfs(grid,_x+1,_y);
        count += dfs(grid,_x,_y+1);
        count += dfs(grid,_x-1,_y);
        count += dfs(grid,_x,_y-1);

        return count ;

    }
}

s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值