并查集总结
class UnionFind
{
public:
vector<int> father;
UnionFind(int num)//num表示元素的个数
{
father.push_back(num);
}
int Find(int n)
{
//非递归
while(father[n] != n)
{
n = father[n];
}
return n;
//递归
if(father[n] == n)
return n;
father[n] = Find(father[n]);//路径压缩版本
return Find(father[n]);
}
void Union(int a, int b)
{
int fa = Find(a);
int fb = Find(b);
father[fb] = fa;
}
}
leetcode 547
leetcode 695
题目: 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)
#include<bits/stdc++.h>
using namespace std;
int getArea(vector<vector<int> >& grid, int i, int j)
{
//由于坐标每次 +1 ,所以判断是否等于数组长度即可
if (i == grid.size() || i < 0)
return 0;
else if (j == grid[0].size() || j < 0)
return 0; ;
if (grid[i][j] == 1)
{
grid[i][j] = 0;
return 1 + getArea(grid, i + 1, j) + getArea(grid, i - 1, j ) + getArea(grid, i, j + 1) + getArea(grid, i, j - 1);
}
return 0;
};
int maxAreaOfIsland(vector<vector<int> >& grid)
{
int maxArea = 0;
int area = 0;
for (int i = 0; i < grid.size(); i++)
{
for (int j = 0; j < grid[0].size(); j++)
{
if (grid[i][j] == 1)
{
//以此为中心,向四周扩散
area = getArea(grid, i, j);
maxArea = maxArea > area ? maxArea : area;
}
}
}
return maxArea;
};
int main()
{
int m,n;
scanf("%d,%d", &m, &n);
vector<vector<int> >nums(m,vector<int>(n,0));
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
{
int x;
scanf("%d,", &x);
nums[i][j] = x;
}
// for(int i = 0; i < m; i++)
// for(int j = 0; j < n; j++)
// {
// printf("%d",nums[i][j]);
// }
int ans = maxAreaOfIsland(nums);
printf("%d", ans);
return 0;
}