题目:
给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。
返回执行此操作后,grid 中最大的岛屿面积是多少?
岛屿 由一组上、下、左、右四个方向相连的 1 形成。
解答:
class Solution:
def largestIsland(self, grid: List[List[int]]) -> int:
#用不同的代号(2,3,....)标记每个岛屿,并使用一个数组记录不同代号的岛屿面积
directions=[[-1,0],[1,0],[0,-1],[0,1]]
m=len(grid)
n=len(grid[0])
flag=2
def InArea(r,c):
if 0<=r<m and 0<=c<n:
return True
return False
#将从(r,c)出发组成的岛屿格子标记为flag,并返回(r,c)所在岛屿的面积
def dfs(r,c):
if not InArea(r,c):
return 0
if grid[r][c]!=1:
return 0
grid[r][c]=flag
return sum([dfs(r+dr,c+dc) for dr,dc in directions])+1
#areas[i]:对应标号为i的岛屿面积
areas=[0,0]
#step1:遍历陆地格子,计算每个岛屿的面积并使用代号标记岛屿
#(不同的岛屿使用不同的代号,同一岛屿使用同一代号)
for i in range(m):
for j in range(n):
#若为陆地
if grid[i][j]==1:
tmp=dfs(i,j)
areas.append(tmp)
flag+=1
#print(grid)
#print(areas)
#返回(r,c)标记为1后,所处岛屿的面积
def traverse(r,c):
tmp=[1]
ans=1
for dr,dc in directions:
if not InArea(r+dr,c+dc):
continue
mark=grid[r+dr][c+dc]
if mark not in tmp:
tmp.append(mark)
ans+=areas[mark]
return ans
res=0
#step2:遍历海洋格子,观察每个海洋格子相邻的陆地格子,计算变换后的最大岛屿面积
#mark:记录当前是否有海洋格子
mark=False
for i in range(m):
for j in range(n):
#若为海洋
if grid[i][j]==0:
mark=True
ans=traverse(i,j)
res=max(res,ans)
if mark:
return res
else:
return m*n