解法一:深度优先搜索(DFS)
时间复杂度 ------ O(M × N),每个格子最多访问一次。
空间复杂度 ------ O(M × N),最坏情况(全是陆地)递归栈深度为 M×N。
python
# encoding = utf-8
# 开发者:Alen
# 开发时间: 12:46
# "Stay hungry,stay foolish."
class Solution(object):
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
if not grid:
return 0
rows, cols = len(grid), len(grid[0])
count = 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 i in range(rows):
for j in range(cols):
if grid[i][j] == '1':
count += 1
dfs(i, j)
return count
解法二:广度优先搜索(BFS)
时间复杂度 ------ O(M × N)
空间复杂度 ------ O(min(M, N)),队列最大存储量是岛屿的"宽度",最坏情况是 min(M,N)(比如对角线形岛屿)。
python
# encoding = utf-8
# 开发者:Alen
# 开发时间: 12:46
# "Stay hungry,stay foolish."
from collections import deque
class Solution(object):
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
if not grid:
return 0
rows, cols = len(grid), len(grid[0])
count = 0
for i in range(rows):
for j in range(cols):
if grid[i][j] == '1':
count += 1
grid[i][j] = '0' # 淹没
queue = deque([(i, j)]) # deque([...]) 双端队列(double-ended queue); queue.popleft() # 弹出 (2, 3)
while queue:
r, c = queue.popleft()
for dr, dc in ((1, 0), (-1, 0), (0, 1), (0, -1)):
nr, nc = r + dr, c + dc
if 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == '1':
grid[nr][nc] = '0' # 淹没
queue.append((nr, nc))
return count
结果
解题步骤:
https://www.bilibili.com/video/BV11brvByE4h/?vd_source=15b4bc8968fa5203cc470cb68ff72c96
