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; } }; ```