1. 程式人生 > >Leetcode-695. 島嶼的最大面積

Leetcode-695. 島嶼的最大面積

## 695. 島嶼的最大面積

**題目描述**

給定一個包含了一些 0 和 1的非空二維陣列 grid , 一個 島嶼 是由四個方向 (水平或垂直) 的 1 (代表土地) 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。

找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為0。)

示例 1:

``` [[0,0,1,0,0,0,0,1,0,0,0,0,0],  [0,0,0,0,0,0,0,1,1,1,0,0,0],  [0,1,1,0,1,0,0,0,0,0,0,0,0],  [0,1,0,0,1,1,0,0,1,0,1,0,0],  [0,1,0,0,1,1,0,0,1,1,1,0,0],  [0,0,0,0,0,0,0,0,0,0,1,0,0],  [0,0,0,0,0,0,0,1,1,1,0,0,0],  [0,0,0,0,0,0,0,1,1,0,0,0,0]] ``` 對於上面這個給定矩陣應返回 6。注意答案不應該是11,因為島嶼只能包含水平或垂直的四個方向的‘1’。

示例 2:

``` [[0,0,0,0,0,0,0,0]] ``` 對於上面這個給定的矩陣, 返回 0。

注意: 給定的矩陣grid 的長度和寬度都不超過 50。

**方法一:DFS**

``` class Solution { public:     int maxAreaOfIsland(vector<vector<int>>& grid) {         // 判斷grid是否為空         if(grid.size() == 0) return 0;         if(grid[0].size() == 0) return 0;         int m = grid.size();         int n = grid[0].size();         // 標記陣列用來儲存該節點是否被查詢過(定義方式要記住!)         vector<vector<bool>> flag(m,vector<bool>(n,false));         int max = 0;         for(int i=0; i<m; i++){             for(int j=0; j<n; j++){                 if(flag[i][j] == true){                     continue;                 }                 // 遞迴求面積                 int res = dfs(grid,i,j,flag);                 if(res > max)                      max = res;             }         }         return max;     }

    int dfs(vector<vector<int>>& grid, int i, int j, vector<vector<bool>>& flag){         // 邊界情況         int m = grid.size();         int n = grid[0].size();          if(i < 0 || j < 0 || i >= m || j>=n){              return 0;         }         // 值為0或該位置已被查詢         if(grid[i][j] == 0 || flag[i][j] == true){             return 0;         }         // 將該位置flag置位true         flag[i][j] = true;         // +1意為加上本節點         return dfs(grid,i-1,j,flag) + dfs(grid,i+1,j,flag) + dfs(grid,i,j-1,flag) + dfs(grid,i,j+1,flag) + 1;     } };  ```