class Solution:
def largestIsland(self, grid: List[List[int]]) -> int:
n,m = len(grid), len(grid[0])
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
# calculate all areas and set grid[x][y] with id(auto-increase, from 2)
areaid = 2
id2size = {}
for i in range(n):
for j in range(m):
if grid[i][j] == 1:
curarea = 0
queue = [(i, j)]
grid[i][j] = areaid
while queue:
x, y = queue.pop()
curarea += 1
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < m and grid[nx][ny] == 1:
grid[nx][ny] = areaid
queue.append((nx, ny))
id2size[areaid] = curarea
areaid += 1
if not id2size:
return 1 if n > 0 else 0
res = max(id2size.values())
for i in range(n):
for j in range(m):
if grid[i][j] == 0:
neighbors = set()
for dx, dy in directions:
nx, ny = i + dx, j + dy
if 0 <= nx < n and 0 <= ny < m and grid[nx][ny] > 1:
neighbors.add(grid[nx][ny])
cursum = 1+ sum(id2size[areaid] for areaid in neighbors)
res = max(res, cursum)
return res