给你一个大小为 m x n
的二进制矩阵 grid
。
岛屿 是由一些相邻的 1
(代表土地) 构成的组合,这里的「相邻」要求两个 1
必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid
的四个边缘都被 0
(代表水)包围着。
岛屿的面积是岛上值为 1
的单元格的数目。
计算并返回 grid
中最大的岛屿面积。如果没有岛屿,则返回面积为 0
。
示例 1:
输入:grid = [[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:
输入:grid = [[0,0,0,0,0,0,0,0]] 输出:0
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
grid[i][j]
为0
或1
思路
和岛屿数量思路没有其他区别,本题主要是记录每次计算的面积,进行一次广搜或深搜后记录这次搜索的面积,然后和初始最大值比较,比较完将这次搜索面积清0,进行下一次搜索
DFS
class Solution {
public:
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int temp=0;
void dfs(vector<vector<int>>& grid,vector<vector<bool>>& visited,int x,int y)
{
for(int i=0;i<4;i++)
{
int nextx=x+dir[i][0];
int nexty=y+dir[i][1];
if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size())
{
continue;
}
if(!visited[nextx][nexty]&&grid[nextx][nexty]==1)
{
visited[nextx][nexty]=true;
temp++;
dfs(grid,visited,nextx,nexty);
}
}
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int maxSquare=0;
int n=grid.size();
int m=grid[0].size();
vector<vector<bool>> visited(n,vector<bool>(m,false));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!visited[i][j]&&grid[i][j]==1)
{
visited[i][j]=true;
temp++;
dfs(grid,visited,i,j);
maxSquare=max(maxSquare,temp);
temp=0;
}
}
}
return maxSquare;
}
};
BFS
class Solution {
public:
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int temp=0;
void bfs(vector<vector<int>>& grid,vector<vector<bool>>& visited,int x,int y)
{
queue<pair<int,int>> que;
que.push({x,y});
visited[x][y]=true;
while(!que.empty())
{
auto cur=que.front();
que.pop();
int curx=cur.first;
int cury=cur.second;
for(int i=0;i<4;i++)
{
int nextx=curx+dir[i][0];
int nexty=cury+dir[i][1];
if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size())
{
continue;
}
if(!visited[nextx][nexty]&&grid[nextx][nexty]==1)
{
visited[nextx][nexty]=true;
temp++;
que.push({nextx,nexty});
}
}
}
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int maxSquare=0;
int n=grid.size();
int m=grid[0].size();
vector<vector<bool>> visited(n,vector<bool>(m,false));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!visited[i][j]&&grid[i][j]==1)
{
temp++;
bfs(grid,visited,i,j);
maxSquare=max(maxSquare,temp);
temp=0;
}
}
}
return maxSquare;
}
};