public int largestIsland(int[][] grid){
int ans = 0;
int maxSize = 0;
int index = 2;
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j]==1){
int size = dfs(grid,i,j,index);
maxSize = Math.max(maxSize,size);
map.put(index,size);
index+=1;
}
}
}
int maxSea = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j]==0){
int sea = plusArea(grid,i,j,map);
maxSea = Math.max(sea,maxSea);
}
}
}
ans = Math.max(maxSize,maxSea);
return ans;
}
public int dfs(int[][] grid, int i, int j, int index){
if (!isArea(grid,i,j) || grid[i][j]!=1){
return 0;
}
grid[i][j] = index;
return 1
+dfs(grid,i-1,j,index)
+dfs(grid,i+1,j,index)
+dfs(grid,i,j-1,index)
+dfs(grid,i,j+1,index);
}
public int plusArea(int[][] grid, int i, int j, Map<Integer,Integer> map){
if (!isArea(grid,i,j) || grid[i][j]!=0){
return 0;
}
int size = 0;
Set<Integer> set = new HashSet<>();
if (isArea(grid,i-1,j)&& grid[i-1][j]>=2){
set.add(grid[i-1][j]);
}
if (isArea(grid,i+1,j)&& grid[i+1][j]>=2){
set.add(grid[i+1][j]);
}
if (isArea(grid,i,j-1)&& grid[i][j-1]>=2){
set.add(grid[i][j-1]);
}
if (isArea(grid,i,j+1)&& grid[i][j+1]>=2){
set.add(grid[i][j+1]);
}
for(int num:set){
size += map.get(num);
}
size +=1;
return size;
}
public boolean isArea(int[][] grid, int i, int j){
return i>=0 && i<grid.length && j>=0 && j<grid[0].length;
}