1.采用DFS 把不同的联通分量标上不同的标记。
2.然后依次遍历为0 的点看链接之后对答案的值有无影响。
class Solution {
public:
vector<vector<int>> dir={{-1,0},{1,0},{0,-1},{0,1}};
int N;
vector<vector<int>> gid;
int largestIsland(vector<vector<int>>& grid) {
N=grid.size();
gid=grid;
int index=2;
vector<int> area(N*N+2,0);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(gid[i][j]==1){
area[index]=DFS(i,j,index);
index++;
}
}
}
int ans=0;
for(int x:area) {
ans=max(x,ans);
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
set<int> seen;
if(gid[i][j]==0){
for(int move:neigh(i,j)){
if(gid[move/N][move%N]>1)
seen.insert(gid[move/N][move%N]);
}
}
int bns=1;
for(int x:seen) bns+=area[x];
ans=max(ans,bns);
}
}
return ans;
}
int DFS(int i,int j,int index){
int ans=1;
gid[i][j]=index;
for(int move:neigh(i,j)){
if(gid[move/N][move%N]==1){
gid[move/N][move%N]=index;
ans+=DFS(move/N,move%N,index);
}
}
return ans;
}
vector<int> neigh(int i,int j){
vector<int> ans;
for(int k=0;k<4;k++){
int ni=i+dir[k][0];
int nj=j+dir[k][1];
if(ni>=0&&ni<N&&nj>=0&&nj<N) ans.push_back(N*ni+nj);
}
return ans;
}
};