剑指offer 2 105.最大岛屿

给定一个由 0 和 1 组成的非空二维数组 grid ,用来表示海洋岛屿地图。

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

找到给定的二维数组中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
在这里插入图片描述
解法:需要一个infect函数,将所有遍历过的“1”都变成“2”。

内在是一个递归函数,每一次从一个“1”开始,然后向四面八方重新开始递归,每一次都确定“1”而不是“0”或者“2”,遇到“0”或者“2”或者到了边界停止就完了,直接return。

没有返回值,修正矩阵。增加全局静态变量tempmax=0,每次进入新岛屿之前设置为0,完成之后直接进行一个比较。

class Solution {
    
    

    static int tempmax = 0;

    public int maxAreaOfIsland(int[][] grid) {
    
    
        
        int a = 0;

        int N = grid.length;
        int M = grid[0].length;
        //我们需要一个infect方法
        //将所有的1转化成2 转化的时候计算数量即可。
        for(int i=0;i<grid.length;i++){
    
    
            for(int j=0;j<grid[0].length;j++){
    
    
                if(grid[i][j]==1){
    
    
                    tempmax = 0;
                    infect(grid,i,j,N,M); //每次infect都返回一个岛屿的最大值
                    a = Math.max(tempmax,a);
                }
            }
        }
        return a ;
    }

    public static void infect(int[][] m,int i,int j,int N ,int M){
    
    
        if( i<0 || i>=N || j<0 || j>=M || m[i][j] != 1) //找完了!
            return;
        
        m[i][j] = 2;
        tempmax++;
        infect(m,i+1,j,N,M);
        infect(m,i-1,j,N,M);
        infect(m,i,j+1,N,M);
        infect(m,i,j-1,N,M);


    }
}

Guess you like

Origin blog.csdn.net/qq_37772958/article/details/121777989