leetcode 695 岛屿的最大面积
一、问题描述
二、解题思路
整体思路
(1)可以采用深度优先搜索+全局变量的方法来解决这个问题。本题的实质是求所有连通块的最大面积,可以在leetcode 200 岛屿数量-CSDN博客的基础上加一个全局变量area,记录当前连通块的面积;
(2)遍历grid数组,如果grid[i][j]==1且visited[i][j]==false,调用dfs函数,将(i,j)所在连通块的所有位置都着色,并统计该连通块的面积,然后执行ret=max(ret,area),最后将area赋值为0。遍历完grid数组后,ret的值即为“岛屿”的最大面积。
具体思路
(1)函数功能:dfs函数将(i,j)所在的连通块全部着色(visited[i][j]赋值为true),并更新area,统计当前连通块的面积;
(2)函数体:
<1>首先,visited[i][j]=true,并将area++;
<2>按照上、右、下、左的顺序从(i,j)位置开始探索,如果(x,y)未越界且未被访问且grid[x][y]==1,就对(x,y)递归调用dfs函数;
三、代码实现
class Solution {int m,n;vector<vector<bool>> visited;int area=0;
public:int maxAreaOfIsland(vector<vector<int>>& grid) {//初始化全局变量m=grid.size();n=grid[0].size();visited.resize(m,vector<bool>(n,false));int ret=area;for(int i=0;i!=m;i++)for(int j=0;j!=n;j++){if(grid[i][j]&&!visited[i][j]){dfs(grid,i,j);ret=max(ret,area);area=0;}}return ret;}int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};void dfs(vector<vector<int>>& grid,int i,int j){visited[i][j]=true;area++;for(int k=0;k!=4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]&&!visited[x][y])dfs(grid,x,y);}}
};