题目地址:
https://leetcode.com/problems/max-area-of-island/
给定一个 m × n m\times n m×n的矩阵,只含 0 0 0和 1 1 1, 1 1 1连成一片就形成了岛屿。问这个矩阵里最大的岛屿的面积(也就是 1 1 1的个数)。
可以用并查集。代码如下:
class Solution {
public:
vector<int> p, sz;
int maxAreaOfIsland(vector<vector<int>>& g) {
int m = g.size(), n = g[0].size(), mn = m * n;
p.resize(mn);
sz.resize(mn);
for (int i = 0; i < mn; i++) p[i] = i, sz[i] = 1;
auto f = [&](int x, int y) { return x * n + y; };
auto merge = [&](int x, int y) {
int px = find(x), py = find(y);
if (px == py) return;
p[px] = py, sz[py] += sz[px];
};
int res = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) {
if (!g[i][j]) continue;
int x = f(i, j);
if (i >= 1 && g[i - 1][j] == 1) merge(x, f(i - 1, j));
if (i + 1 < m && g[i + 1][j] == 1) merge(x, f(i + 1, j));
if (j >= 1 && g[i][j - 1] == 1) merge(x, f(i, j - 1));
if (j + 1 < n && g[i][j + 1] == 1) merge(x, f(i, j + 1));
}
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (g[i][j]) res = max(res, sz[f(i, j)]);
return res;
}
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
};
时间复杂度 O ( m n log ∗ m n ) O(mn\log^*mn) O(mnlog∗mn),空间 O ( m n ) O(mn) O(mn)。