LeetCode0695-海岛岛屿最大面积

深度搜索

经典之海岛岛屿

题目

给你一个大小为 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

posted @ 2021-10-30 10:59  RetenQ  阅读(42)  评论(0编辑  收藏  举报