题意:
给定一个用 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++; } } } } };
时间复杂度:空间复杂度: