并查集(Disjointed Set)是一种非常精巧而且实用的数据结构,主要用于处理一些不相交集合的合并问题。
一、题目描述
二、样例
三、解题思路
1.求解步骤
利用并查集(数组a)记录连通的陆地,连通块大小(数组si)记录连通块的尺寸。
1,预处理并查集数组和连通块大小数组。
2,扫描grid数组,对陆地进行“向上、向左”的连通判定(注意小于0越界),一旦连通调用并查集合并函数更新连通块大小。
3,扫描si数组,最大值即为所求的结果。
2.AC代码
代码如下(C++):
class Solution {
public:
int a[100][100];//并查集
int si[100][100];//记录连通块大小
int m,n;
void init_set()//初始化并查集并设连通块为1
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
a[i][j]=i*n+j;//二维数组映射成为整数
si[i][j]=1;
}
}
int find_set(int x)//并查集查找函数
{
int xx=x/n;
int yy=x%n;//整数映射还原二维数组下标
return a[xx][yy]==x?x:find_set(a[xx][yy]);
}
void union_set(int x,int y)//并查集合并,同时累计连通块大小
{
x=find_set(x);
y=find_set(y);
int xx1=x/n,yy1=x%n;
int xx2=y/n,yy2=y%n;
if(x!=y){si[xx1][yy1]=si[xx1][yy1]+si[xx2][yy2];si[xx2][yy2]=si[xx1][yy1];a[xx1][yy1]=a[xx2][yy2];}
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
m=grid.size();
n=grid[0].size();
init_set();
for(int i=0;i<m;i++)//扫描grid数组并处理并查集
for(int j=0;j<n;j++)
{
if(grid[i][j])
{
if(j>0)
{
if(grid[i][j-1])
{
union_set(a[i][j-1],a[i][j]);
}
}
if(i>0)
{
if(grid[i-1][j])
{
union_set(a[i-1][j],a[i][j]);
}
}
}
}
int ans=0;
for(int i=0;i<m;i++)//扫描si数组(表示连通块大小),最大值即为所求的结果
for(int j=0;j<n;j++)
{
if(grid[i][j]) if(si[i][j]>ans)ans=si[i][j];
}
return ans;
}
};
3.提交结果
—
总结
以上就是关于LeetCode 剑指 Offer II 105. 岛屿的最大面积 C++ 并查集的全部内容。