題目:
給定一個(gè)包含了一些 0 和 1 的非空二維數(shù)組 grid 仔拟。
一個(gè) 島嶼 是由一些相鄰的 1 (代表土地) 構(gòu)成的組合贺纲,這里的「相鄰」要求兩個(gè) 1 必須在水平或者豎直方向上相鄰。你可以假設(shè) grid 的四個(gè)邊緣都被 0(代表水)包圍著聂沙。
找到給定的二維數(shù)組中最大的島嶼面積。(如果沒有島嶼,則返回面積為 0 国旷。)
示例:
輸入:
[[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]]
對(duì)于上面這個(gè)給定矩陣應(yīng)返回 6。注意答案不應(yīng)該是 11 茫死,因?yàn)閸u嶼只能包含水平或垂直的四個(gè)方向的 1 跪但。
解題方法:
深度搜索dfs:
- 首先就是遍歷每一個(gè)元素,判斷是否是1峦萎。如果是1屡久,就送進(jìn)dfs函數(shù)中搜索周圍區(qū)域,統(tǒng)計(jì)島的大小爱榔,在統(tǒng)計(jì)之后被环,把1重置為0,防止某一個(gè)區(qū)域被多次搜索详幽;如果不是1筛欢,就繼續(xù)遍歷其他位置。
- dfs函數(shù)中需要注意的是:1. 數(shù)組邊界的判斷唇聘,不能超過搜索邊界版姑;2. 搜索方向,(i雳灾,j)的上下左右漠酿;3. 被統(tǒng)計(jì)的區(qū)域要重置為0。
代碼和結(jié)果:
class Solution {
public:
int dfs(vector<vector<int>>& grid,int i,int j)
{
int h=grid.size();
int w=grid[0].size();
if(i>=h||i<0||j>=w||j<0)
return 0;
if(grid[i][j]==0)
return 0;
else
{
grid[i][j]=0;
int a=dfs(grid,i+1,j);
int b=dfs(grid,i-1,j);
int c=dfs(grid,i,j+1);
int d=dfs(grid,i,j-1);
return 1+a+b+c+d;
}
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int h=grid.size();
int w=grid[0].size();
int mxv=0;
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
if(grid[i][j]==1)
{
int area=dfs(grid,i,j);
mxv=mxv>area?mxv:area;
}
}
}
return mxv;
}
};
運(yùn)行結(jié)果: