给定一个包含了一些 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。
C
void DFS(int** tmp,int row,int col,int* area,int m,int n)
{
(*area)++;
tmp[row][col]=2;
if(row-1>=0 && 1==tmp[row-1][col])
{
DFS(tmp,row-1,col,area,m,n);
}
if(row+1<=m-1 && 1==tmp[row+1][col])
{
DFS(tmp,row+1,col,area,m,n);
}
if(col-1>=0 && 1==tmp[row][col-1])
{
DFS(tmp,row,col-1,area,m,n);
}
if(col+1<=n-1 && 1==tmp[row][col+1])
{
DFS(tmp,row,col+1,area,m,n);
}
}
int maxAreaOfIsland(int** grid, int gridRowSize, int gridColSize)
{
int m=gridRowSize;
int n=gridColSize;
if(0==m || 0==n)
{
return 0;
}
int area=0;
int res=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(1==grid[i][j])
{
DFS(grid,i,j,&area,m,n);
res=res>area?res:area;
area=0;
}
}
}
return res;
}
C++
class Solution {
public:
void DFS(vector<vector<int>>& tmp,int row,int col,int& area)
{
area++;
tmp[row][col]=2;
if(row-1>=0 && 1==tmp[row-1][col])
{
DFS(tmp,row-1,col,area);
}
if(row+1<=tmp.size()-1 && 1==tmp[row+1][col])
{
DFS(tmp,row+1,col,area);
}
if(col-1>=0 && 1==tmp[row][col-1])
{
DFS(tmp,row,col-1,area);
}
if(col+1<=tmp[0].size()-1 && 1==tmp[row][col+1])
{
DFS(tmp,row,col+1,area);
}
}
int maxAreaOfIsland(vector<vector<int>>& grid)
{
if(grid.empty() || grid[0].empty())
{
return 0;
}
int res=0;
int area=0;
int m=grid.size();
int n=grid[0].size();
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(1==grid[i][j])
{
DFS(grid,i,j,area);
res=max(res,area);
area=0;
}
}
}
return res;
}
};
C++法二
class Solution {
public:
int DFS(vector<vector<int>>& tmp,int row,int col,int area)
{
area++;
tmp[row][col]=2;
if(row-1>=0 && 1==tmp[row-1][col])
{
area=DFS(tmp,row-1,col,area);
}
if(row+1<=tmp.size()-1 && 1==tmp[row+1][col])
{
area=DFS(tmp,row+1,col,area);
}
if(col-1>=0 && 1==tmp[row][col-1])
{
area=DFS(tmp,row,col-1,area);
}
if(col+1<=tmp[0].size()-1 && 1==tmp[row][col+1])
{
area=DFS(tmp,row,col+1,area);
}
return area;
}
int maxAreaOfIsland(vector<vector<int>>& grid)
{
if(grid.empty() || grid[0].empty())
{
return 0;
}
int res=0;
int area=0;
int m=grid.size();
int n=grid[0].size();
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(1==grid[i][j])
{
area=DFS(grid,i,j,area);
res=max(res,area);
area=0;
}
}
}
return res;
}
};
python
class Solution:
def DFS(self,tmp,row,col,area):
tmp[row][col]=2
area+=1
if row-1>=0 and 1==tmp[row-1][col]:
area=self.DFS(tmp,row-1,col,area)
if row+1<=len(tmp)-1 and 1==tmp[row+1][col]:
area=self.DFS(tmp,row+1,col,area)
if col-1>=0 and 1==tmp[row][col-1]:
area=self.DFS(tmp,row,col-1,area)
if col+1<=len(tmp[0])-1 and 1==tmp[row][col+1]:
area=self.DFS(tmp,row,col+1,area)
return area
def maxAreaOfIsland(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
if []==grid or [[]]==grid:
return 0
m=len(grid)
n=len(grid[0])
res=0
area=0
for i in range(m):
for j in range(n):
if 1==grid[i][j]:
area=self.DFS(grid,i,j,area)
res=max(res,area)
area=0
return res