1. 程式人生 > 其它 >LeetCode0695-海島島嶼最大面積

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