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