leetcode695. 島嶼的最大面積_C++_med

給定一個包含了一些 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。

思路如下:這一類問題應該屬於二維空間的回溯問題,之前有看過別人的思路,也有敲過代碼,但是發現每個人的習慣都不一樣,最好還是懂的思路以後自己寫出代碼來。這道題就是利用深度優先遍歷,對於每一個點都找一下,如果grid[i][j]==1那麼就尋找它的前後左右,同時用一個數組visited記錄是否被尋找過。

 

C++如下:

class Solution {
  //  int d[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    //找下連接grid[i][j]的島嶼數量有多少 如果grid[i][j]沒有被計算過的話
    void count(vector<vector<int>>& grid,int i,int j,int &num,vector<vector<bool>>& visited)
    {
        if(i <0 || j <0 || i>=grid.size() || j >= grid[0].size()) return;
        if(grid[i][j]== 1 && visited[i][j] == false)
        {//沒被計算過
            visited[i][j]=true;
            num++; 
            count(grid,i,j+1,num,visited);
            count(grid,i,j-1,num,visited);
            count(grid,i+1,j,num,visited);
            count(grid,i-1,j,num,visited);
            return;
        }
        return;
    }
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int res=0;
        if(grid.size() ==0) return 0;
        int we = grid[0].size();
        int he = grid.size();      
        vector<vector<bool>> visited(he,vector<bool>(we,false));
        
        for(int i=0; i<he; i++)
        {
            for(int j=0; j< we; j++)
            {
                if(grid[i][j] == 1)
                {//判斷相鄰的有多少
                    int num = 0;
                    count(grid,i,j,num,visited);
                    res = max(res,num);
                }
               
            }
                      
        }
            
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章