import java.util.HashMap;
import java.util.HashSet;
class Solution {
public int largestIsland(int[][] grid) {
// 思路: 遇到1,渲染,cnt++.然后统计每个岛屿的大小。
// 遍历。遇到0 ,看上下左右分别是哪些独立的岛屿。加起来。
int ans = 0;
int cnt = 2; // 从2开始
int m = grid.length;
int n = grid[0].length;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
f(i, j, grid, cnt++);
}
}
}
// 统计每个岛屿的大小
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] > 1) {
int cur = grid[i][j];
map.put(cur, map.getOrDefault(cur, 0) + 1);
}
}
}
if (map.getOrDefault(2, 0) == m * n) {
// 全是1的特殊情况
return m * n;
}
// 遍历每个0.如果改为1.看上下左右合起来是多少。
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 0) {
ans = Math.max(ans, get(i, j, grid, map));
}
}
}
return ans + 1;
}
public int get(int i, int j, int[][] grid, HashMap<Integer, Integer> map) {
HashSet<Integer> hashSet = new HashSet();
if (i - 1 >= 0) {
hashSet.add(grid[i - 1][j]);
}
if (i + 1 < grid.length) {
hashSet.add(grid[i + 1][j]);
}
if (j - 1 >= 0) {
hashSet.add(grid[i][j - 1]);
}
if (j + 1 < grid[0].length) {
hashSet.add(grid[i][j + 1]);
}
int ans = 0;
for (Integer cnt : hashSet) {
ans += map.getOrDefault(cnt, 0);
}
return ans;
}
public void f(int i, int j, int[][] grid, int cnt) {
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] != 1) {
return;
}
grid[i][j] = cnt;
f(i + 1, j, grid, cnt);
f(i - 1, j, grid, cnt);
f(i, j + 1, grid, cnt);
f(i, j - 1, grid, cnt);
}
}