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

leetcode-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。

解法:

​​class Solution {
    
void dfs( vector<vector<int>>& grid,int i,int j,int& cnt,int &max){
    if(i<0||i>=grid.size()||j<0||j>=grid[0].size())//越界時返回
        return;
    if(0==grid[i][j])//遇到0時,返回
        return;
    ++cnt;//遇到1時,計數器加一
    grid[i][j]=0;//把1修改為0,作用相當於visited矩陣,逐步減少規模
   int iNext[]={-1,1,0,0,};
   int jNext[]={0,0,-1,1};
    for(int k=0;k<4;++k){//對上下左右四個方向進行深搜
        int I=i+iNext[k];
        int J=j+jNext[k];
      dfs(grid,I,J,cnt,max);
    }
    max=(max>cnt)?max:cnt;//主過程返回後,更新max的值
}
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int rows=grid.size();
        int cols=grid[0].size();
        int max=0;
        
        for(int i=0;i<rows;++i){
            for(int j=0;j<cols;++j){
                int cnt=0;//對於每一個1,將cnt初始化為0
                if(1==grid[i][j])//從值為1的點出發做深搜
                    dfs(grid,i,j,cnt,max);
            }
            
        } 
        
return max;
    }
};