LeetCode0695-海島島嶼最大面積
阿新 • • 發佈:2021-10-30
深度搜索
經典之海島島嶼
題目
給你一個大小為 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