695-岛屿最大面积-力扣-Python版代码解析
原题链接:695-岛屿最大面积-力扣
标签:蓝桥杯, 思维, BFS, 省赛
Python代码答案与分析
from collections import deque
from typing import List
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
res = 0
di = [(-1, 0), (1, 0), (0, -1), (1,0)]
n, m = len(grid), len(grid[0])
def bfs(i,j): #考虑登陆点为(i, j)的岛屿,本函数就是计算这个岛屿的面积
ans = 1
q = deque([(i, j)])
grid[i][j] = 0 #登陆点设置为0,表示已经访问过
while q:
x, y = q.popleft()#弹出队首,然后考虑其上下左右四个方向是否有陆地
for dx, dy in di:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < m and grid[nx][ny]:
q.append((nx, ny)) #条件都满足,说明该块是陆地,加入队列
ans += 1
grid[nx][ny] = 0 #标记该块已经访问
return ans
for i, row in enumerate(grid):
for j, x in enumerate(row):
if x == 1: #说明是登陆点,开始遍历所有连通分量
res = max(res, bfs(i, j))
return res
代码整体逻辑解释
这段代码的主要功能是计算给定二维网格中最大岛屿的面积。具体步骤如下:
- 初始化:
- res 用于存储最大岛屿的面积,初始化为 0。
- di 是一个列表,存储了四个方向的偏移量,用于在广度优先搜索时遍历相邻位置。
- n 和 m 分别是网格的行数和列数。
- 广度优先搜索(BFS)函数 bfs:
- 该函数接收一个起始位置 (i, j) 作为参数,用于计算从该位置开始的岛屿的面积。
- 使用双端队列 q 来实现 BFS,将起始位置加入队列,并将其标记为已访问(将 grid[i][j] 设为 0)。
- 不断从队列中取出元素,遍历其四个相邻位置,如果相邻位置在网格范围内且是陆地,则将其加入队列,标记为已访问,并更新岛屿面积。
- 最后返回该岛屿的面积.
- 遍历网格:
- 使用两层循环遍历网格中的每一个位置。
- 当遇到陆地(值为 1)时,调用 bfs 函数计算该岛屿的面积,并更新最大岛屿面积 res。
- 返回结果:
- 遍历结束后,返回最大岛屿面积 res。

480

被折叠的 条评论
为什么被折叠?



