这个题解采用了深度优先搜索(DFS)的思路。首先,遍历整个网格,对于每个值为1的格子,执行DFS遍历其连通的1,并标记为一个新的岛屿编号(dum),同时记录该岛屿的面积。接着,再次遍历网格,对于每个值为0的格子,计算若将其变为1后,能够连接到的岛屿的面积之和,更新最大面积。最后返回最大面积。
时间复杂度: O(n^2)
空间复杂度: O(n^2)
class Solution:
def largestIsland(self, grid: list[list]):
dum=1
dtom={0:0} # 用于存储岛屿编号和对应的面积
li=len(grid)
lj=len(grid[0])
def biaozhu(i,j): # DFS遍历连通的1,并标记岛屿编号
if(i<0 or j<0 or i>=li or j>=lj):
return
elif grid[i][j]==1:
grid[i][j]=dum
dtom[dum]+=1
biaozhu(i+1,j)
biaozhu(i-1,j)
biaozhu(i,j+1)
biaozhu(i,j-1)
else:
return
for i in range(li): # 遍历网格,对每个值为1的格子执行DFS标记
for j in range(lj):
if grid[i][j]==1:
dum+=1
dtom[dum]=0
biaozhu(i,j)
if(dum==1): # 特殊情况处理
return 1
elif dtom[2]==li*lj:
return dtom[2]
maxmian=0
def countmian(i,j): # 统计将(i,j)变为1后,连接到的岛屿面积之和
tem=1
tlist=[]
if i+1<li:
tem+=dtom[grid[i+1][j]]
tlist.append(grid[i+1][j])
if i-1>=0 and not grid[i-1][j] in tlist:
tem+=dtom[grid[i-1][j]]
tlist.append(grid[i-1][j])
if j+1<lj and not grid[i][j+1] in tlist:
tem+=dtom[grid[i][j+1]]
tlist.append(grid[i][j+1])
if j-1>=0 and not grid[i][j-1] in tlist:
tem+=dtom[grid[i][j-1]]
return tem
for i in range(li): # 遍历网格,对每个值为0的格子,统计连接的岛屿面积之和,更新最大面积
for j in range(lj):
if grid[i][j]==0:
tem=countmian(i,j)
maxmian=tem if tem>maxmian else maxmian
return maxmian