日期:2026年10月16日
LeetCode 題目連結:695. Max Area of Island
解題想法
中等難度題。題目給一個 $m \times n$ 的二維陣列 $grid$,其中只有代表陸地的 $1$ 以及代表水域的 $0$,並且假設 $grid$ 四周都是 $0$。陸地可以往右、下、左、上等四個方向連接。要找出 $grid$ 之中面積最大的島嶼,也就是由最多的 $1$ 組成的連通區塊。連通區塊的題目,用 BFS 或 DFS 都可以解,由於我是以 Python 為主要的解題語言,我比較習慣用 BFS,如果用 DFS 經常會遇到遞迴深度過深的問題。這題我兩個方法都有寫,如果用 Python 解題 BFS 跑比較快,如果用 C++ 解題 DFS 跑比較快。
Python 程式碼
BFS. Runtime: 11 ms, beats 96.45%. Memory: 19.38 MB, beats 94.88%.
from collections import deque
class Solution:
def maxAreaOfIsland(self, grid: list[list[int]]) -> int:
m, n, imax = len(grid), len(grid[0]), 0
for i in range(m):
for j in range(n):
if grid[i][j] == 0:
continue
grid[i][j] = 0
area = 1
que = deque([(i, j)])
while que:
r, c = que.popleft()
for dr, dc in ((0, 1), (1, 0), (0, -1), (-1, 0)):
nr, nc = r + dr, c + dc
if 0 <= nr < m and 0 <= nc < n and grid[nr][nc] == 1:
grid[nr][nc] = 0
area += 1
que.append((nr, nc))
imax = max(imax, area)
return imax
DFS. Runtime: 17 ms, beats 67.40%. Memory: 20.39 MB, beats 64.21%.
class Solution:
def maxAreaOfIsland(self, grid: list[list[int]]) -> int:
m, n, imax = len(grid), len(grid[0]), 0
area = 0
# 自訂 dfs 函式,找連通區塊面積同時將走過的格子標記為 0
def dfs(r, c):
nonlocal area
area += 1
grid[r][c] = 0
for dr, dc in ((0, 1), (1, 0), (0, -1), (-1, 0)):
nr, nc = r + dr, c + dc
if 0 <= nr < m and 0 <= nc < n and grid[nr][nc] == 1:
dfs(nr, nc)
# 掃過每一格,跳過 0,遇到 1 呼叫 dfs
for i in range(m):
for j in range(n):
if grid[i][j] == 0:
continue
# area 歸零之後再呼叫 dfs 找連通區塊面積
area = 0
dfs(i, j)
imax = max(imax, area)
return imax