题目:827. 最大人工岛
思路:查并集
class Solution {
public:
int largestIsland(vector<vector<int>>& grid) {
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
int n = grid.size();
int res = 0;
vector<int> p(n*n);
vector<int> size(n*n,1);
iota(p.begin(),p.end(),0); //init
function<int(int)> find = [&](int x){
if(p[x]!=x){
p[x]=find(p[x]);
}
return p[x];
};
function<void(int,int)> unite = [&](int a,int b){
int pa = find(a);
int pb = find(b);
if(pa==pb) return;
p[pa]=pb;
size[pb]+=size[pa];
res = max(res,size[pb]);
};
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
if(n==1) res=1;
if(grid[i][j]){
for(int k=0;k<4;++k){
int nx= i+dx[k];
int ny= j+dy[k];
if(nx>=0 && nx<n && ny>=0 && ny<n && grid[nx][ny]){
unite(i*n+j,nx*n+ny);
}
}
}
}
}
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
if(!grid[i][j]){
int t=1;
unordered_set<int> vis;
for(int k=0;k<4;++k){
int nx= i+dx[k];
int ny= j+dy[k];
if(nx>=0 && nx<n && ny>=0 && ny<n && grid[nx][ny]){
int root=find(nx*n+ny);
if(vis.find(root)==vis.end()){
vis.insert(root);
t+=size[root];
}
}
}
res = max(res,t);
}
}
}
return res;
}
};