LeetCode 827. 最大人工岛
并查集 + 枚举
class Solution {
public:
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int largestIsland(vector<vector<int>>& g) {
int n = g.size();
vector<int> p(n * n + 10);
vector<int> cnt(n * n + 10, 1);
iota(p.begin(), p.end(), 0);
function<int(int)> find;
find = [&](int x) -> int{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
};
int res = 1;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
{
if(!g[i][j]) continue;
for(int k = 0; k < 4; k ++)
{
int a = i + dx[k], b = j + dy[k];
if(a < 0 || a >= n || b < 0 || b >= n || !g[a][b]) continue;
int pa = find(i * n + j), pb = find(a * n + b);
if(pa == pb) continue;
p[pb] = pa;
cnt[pa] += cnt[pb];
res = max(res, cnt[pa]);
}
}
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
{
if(g[i][j]) continue;
int t = 1;
unordered_set<int> st;
for(int k = 0; k < 4; k ++)
{
int a = i + dx[k], b = j + dy[k];
if(a < 0 || a >= n || b < 0 || b >= n || !g[a][b]) continue;
int pa = find(a * n + b);
if(st.count(pa)) continue;
t += cnt[pa];
st.insert(pa);
}
res = max(res, t);
}
return res;
}
};