【题目】
【代码】
其实这题的本质就是:
岛屿数量
而岛屿数量
的本质就是:非联通子图的个数
岛屿这类题目都是以矩阵
的形式给出的,矩阵的本质和无向图
是一样的,都需要记录是否访问过某个点
这题求最大的岛屿面积,首先需要遍历每个点,判断该点是否被访问过,如果该点是岛屿的一部分且没有被访问过,则遍历该岛屿的面积
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
visit=[[0 for i in range(len(grid[0]))] for i in range(len(grid))]
ans=0
def dfs(x,y):
if x>=0 and x<len(grid) and y>=0 and y<len(grid[0]) and grid[x][y]==1 and visit[x][y]==0:
visit[x][y]=1
return 1+dfs(x-1,y)+dfs(x+1,y)+dfs(x,y+1)+dfs(x,y-1)
return 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j]==1 and visit[i][j]==0:
ans=max(ans,dfs(i,j))
return ans
【方法2】不占用额外空间 不用单独设置visited数组
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
ans=0
def dfs(x,y):
if x>=0 and x<len(grid) and y>=0 and y<len(grid[0]) and grid[x][y]==1:
grid[x][y]=0
return 1+dfs(x-1,y)+dfs(x+1,y)+dfs(x,y+1)+dfs(x,y-1)
return 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j]==1:
ans=max(ans,dfs(i,j))
return ans
【方法3】栈代替递归
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
ans=0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j]==1:
cnt=0
stack=[(i,j)]
while stack:
x,y=stack.pop()
if x>=0 and x<len(grid) and y>=0 and y<len(grid[0]) and grid[x][y]==1:
cnt+=1
grid[x][y]=0
stack.append((x-1,y))
stack.append((x+1,y))
stack.append((x,y+1))
stack.append((x,y-1))
ans=max(ans,cnt)
return ans