给定一个包含了一些 0 和 1的非空二维数组 grid
, 一个 岛屿 是由四个方向 (水平或垂直) 的 1
(代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)
示例 1:
[[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:
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0
。
注意: 给定的矩阵grid
的长度和宽度都不超过 50。
思路 并查集
class Solution {
private:
int num;
int* father = new int[3000];
void init(int x) {
num = x;
for(int i = 1; i <= num; i++)
father[i] = i;
}
int find(int x) {
if(father[x] != x)
father[x] = find(father[x]);
return father[x];
}
void merge(int x, int y) {
int a = find(x);
int b = find(y);
if(a != b)
father[b] = a;
}
int getSubsetNum() {
int res = 0;
for(int i = 1; i <= num; i++)
if(father[i] == i)
res++;
return res;
}
int getMaxNum()
{
vector<int> vt(3000,0);
for(int i = 1; i <= num; i++)
if(father[i]>0)
{
//cout<<father[i]<<endl;
//cout<<i<<" "<<find(i)<<endl;
vt[find(i)]++;
}
return *max_element(vt.begin(),vt.end());
}
public:
int xx[4]= {1,-1,0,0};
int yy[4]= {0,0,1,-1};
int n,m;
int icount=0;
int maxAreaOfIsland(vector<vector<int>>& grid) {
n=grid.size();
if(n==0) return 0;
m=grid[0].size();
int inum=0;
init(m*n);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++) {
if(grid[i][j]==1) inum++;
else father[i*m+j+1]=-1;
}
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(grid[i][j]==0) continue;
for(int k=0; k<4; k++) {
int nx=i+xx[k];
int ny=j+yy[k];
if(nx<0||nx>=n||ny<0||ny>=m) continue;
else
{
if(grid[nx][ny]==1)
{
merge(i*m+j+1,nx*m+ny+1);
}
}
}
}
return getMaxNum();
}
};
dfs
class Solution {
public:
int xx[4]= {1,-1,0,0};
int yy[4]= {0,0,1,-1};
int n,m;
int icount=0,imax=0;
void dfs(int x,int y,vector< vector<bool> > &vist) {
vist[x][y]=true;
icount++;
imax=max(icount,imax);
for(int k=0; k<4; k++) {
int nx=x+xx[k];
int ny=y+yy[k];
if(nx<0||nx>=n||ny<0||ny>=m)
continue;
if(!vist[nx][ny])
{
dfs(nx,ny,vist);
}
}
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
n=grid.size();
if(n==0) return 0;
m=grid[0].size();
vector<bool> t(m,0);
vector< vector<bool> > vist(n,t);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++) {
if(grid[i][j]==0) vist[i][j]=true;
}
for(int i=0; i<n; i++)
for(int j=0; j<m; j++) {
if(!vist[i][j]) {
icount=0;
dfs(i,j,vist);
}
}
cout<<imax<<endl;
return imax;
}
};