题意:
给定一个用 n*m 矩阵表示的群岛的地图,其中 1 表示岛屿, 0 表示海洋,每个岛屿的水平或竖直方向相邻的岛屿可以视为连在一起的岛屿,每一块岛屿视为面积为 1 。
请问面积最大的岛屿是多少。
方法一:
dfs
思路:利用 dfs 拓展岛屿的面积,然后维护面积的最大值。
dfs 要用递归的遍历四个方向,不断访问可以访问的点。
class Solution {
public:
int vis[55][55]={0};//判断是否访问过
int a[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//四个方向
int res=0,n,m;
int cnt;
int maxAreaIsland(vector<vector<int> >& grid) {
n=grid.size();
if(n==0)
return 0;
m=grid[0].size();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(vis[i][j]==0&&grid[i][j]==1){//如果未访问过,则访问
cnt=0;
dfs(i,j,grid);
res=max(cnt,res);//维护最大值
}
}
}
return res;
}
void dfs(int x,int y,vector<vector<int> >& grid){
vis[x][y]=1;
cnt++;//面积加一
for(int i=0;i<4;i++){//遍历四个方向
int nx=x+a[i][0],ny=y+a[i][1];
if(nx<0||nx>=n||ny<0||ny>=m){//下标越界判断
continue;
}
if(vis[nx][ny]==0&&grid[nx][ny]==1){//如果未访问过,则访问
dfs(nx,ny,grid);
}
}
}
};
时间复杂度:
空间复杂度:![]()
方法二:
bfs
思路:利用 bfs 拓展岛屿的面积,然后维护面积的最大值。bfs 要用队列遍历四个方向,不断访问可以访问的点。
class Solution {
public:
int vis[55][55]={0};//判断是否访问过
int a[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//四个方向
int res=0,n,m;
int cnt;
int maxAreaIsland(vector<vector<int> >& grid) {
n=grid.size();
if(n==0)
return 0;
m=grid[0].size();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(vis[i][j]==0&&grid[i][j]==1){//如果未访问过,则访问
bfs(i,j,grid);
res=max(cnt,res);//维护最大值
}
}
}
return res;
}
void bfs(int x,int y,vector<vector<int> >& grid){
queue<pair<int,int>> q;//队列
q.push({x,y});//入队
vis[x][y]=1;
cnt=1;//面积初始化为1
while(!q.empty()){
auto t=q.front();
q.pop();//出队
for(int i=0;i<4;i++){//遍历四个方向
int nx=t.first+a[i][0],ny=t.second+a[i][1];
if(nx<0||nx>=n||ny<0||ny>=m){//下标越界判断
continue;
}
if(vis[nx][ny]==0&&grid[nx][ny]==1){//如果未访问过,则访问
q.push({nx,ny});
vis[nx][ny]=1;
cnt++;
}
}
}
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号