最近面试经常被考到岛屿问题,于是简单整理了几道岛屿相关的问题供大家参考。
200. 岛屿问题
题目重点:给你一个二维网格 grid,里面每个格子是 '1': 陆地, '0': 水域,目标:计算一共有多少快不连通的陆地块即岛屿。
思路:DFS搜索所有的岛屿,遍历整个 gird,每遇到一个'1'就说明找到了一个新的岛屿,然后从这个点出发,用DFS把这个岛屿上所有的'1'都标记为‘0’,表示已访问过。
核心代码:
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
if not grid or not grid[0]:
return 0
rows, cols = len(grid), len(grid[0])
res = 0
def dfs(r, c):
# 越界或遇到水,停止递归
if r < 0 or r >= rows or c < 0 or c >= cols or grid[r][c] == '0':
return
grid[r][c] = '0' # 标记已访问
# 四个方向继续搜索
dfs(r+1, c)
dfs(r-1, c)
dfs(r, c+1)
dfs(r, c-1)
for r in range(rows):
for c in range(cols):
if grid[r][c] == '1':
res += 1
dfs(r, c) # 从这个'1'开始清除整块岛屿
return res
695. 岛屿的最大面积
题目重点:给你一个二维网格 grid,里面每个格子是 1: 陆地, 0: 水域,目标:返回所有岛屿中,面积最大的那一个岛屿的面积(即最多有多少个相连的1)
思路:从每个为1的点出发,做DFS把整个岛屿搜索一遍,并统计该岛屿面积;每次找到新的1,就启动一次DFS,返回该岛屿的面积,更新最大值。
核心代码:
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
rows, cols = len(grid), len(grid[0])
max_area = 0
def dfs(r, c):
if r < 0 or r >= rows or c < 0 or c >= cols or grid[r][c] == 0:
return 0
grid[r][c] = 0 # 标记为已访问
area = 1 # 当前格子
# 四个方向探索
area += dfs(r+1, c)
area += dfs(r-1, c)
area += dfs(r, c+1)
area += dfs(r, c-1)
return area
for r in range(rows):
for c in range(cols):
if grid[r][c] == 1:
max_area = max(max_area, dfs(r, c))
return max_area
200. 岛屿问题 vs. 695. 岛屿的最大面积
岛屿问题核心:每发现一块新的岛屿就计数 +1,不关心每块的面积有多大。
岛屿的最大面积核心:每次DFS不计数,而是累计这块岛屿的大小,再找最大值。

86

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



