leedcode 827. 最大人工岛 (洪水填充)
测试链接:https://leetcode.cn/problems/making-a-large-island/
思路:
先用洪水填充给每个岛屿进行编号,以便最后答案更新区分,设置一个used[]数组,用来避免更新答案时候算了重复的岛屿,为了避免全图都为陆地的特殊情况,我们在进行岛屿编号的时候,先更新答案为最大岛屿的面积,接着遍历每个海水的点,计算周围岛屿的面积之和,更新答案,记得加上该点本身的面积,所以初始化ans1=1
题解:
const int N=3e5;
class Solution {
public:
int ans=0;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int cursize[N];
bool used[N];
int n,m;
int id=1;
void dfs(int i,int j,vector<vector<int>>&grid)
{
grid[i][j]=id;
cursize[id]++;
for(int k=0;k<4;k++)
{
int x = i+dir[k][0];
int y = j+dir[k][1];
if(x<0||x>=n||y<0||y>=m||grid[x][y]!=1)continue;
dfs(x,y,grid);
}
}
int largestIsland(vector<vector<int>>& grid) {
n = grid.size();
m = grid[0].size();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(grid[i][j]==1)
{
id++;
dfs(i,j,grid);
}
ans = max(ans,cursize[id]);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)cout<<grid[i][j];
cout<<endl;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(grid[i][j]==0)
{
int ans1=1;
for(int k=0;k<4;k++)
{
int x = i+dir[k][0];
int y = j+dir[k][1];
if(x<0||x>=n||y<0||y>=m||grid[x][y]==0||used[grid[x][y]])continue;
used[grid[x][y]]=true;
ans1+=cursize[grid[x][y]];
}
for(int k=0;k<4;k++)
{
int x = i+dir[k][0];
int y = j+dir[k][1];
if(x<0||x>=n||y<0||y>=m||grid[x][y]==0)continue;
used[grid[x][y]]=false;
}
ans=max(ans,ans1);
}
}
}
return ans;
}
};

浙公网安备 33010602011771号