日期:2026年10月26日
LeetCode 題目連結:3619. Count Islands With Total Value Divisible by K
解題想法
中等難度題。題目給一個二維陣列 $grid$,其中正整數代表陸地,0 代表海洋,地圖邊緣視為海洋。陸地可以與右、下、左、上相鄰的陸地相連,如果周圍被海洋環繞一圈,這片相連的陸地是一座島嶼。計算 $grid$ 之中有幾座島嶼的數值加總可以被 $k$ 整除。
這題是標準的 BFS。用雙層 for 迴圈掃過 $grid$ 每一格,如果遇到正整,從這格開始 BFS 計算加總 $val$,計算的過程中同時對 $k$ 取餘數。將走過的陸地都標示為 0,直接修改 $grid$ 的內容即可,節省記憶體。BFS 結束之後,如果 $val$ 等於 0,答案 $ans$ 加 1。
Python 程式碼
Runtime: 270 ms, beats 90.00%. Memory: 30.06 MB, beats 93.79%.
class Solution:
def countIslands(self, grid: List[List[int]], k: int) -> int:
m, n, ans = len(grid), len(grid[0]), 0 # 地圖 m*n,答案
# 掃過每一格,如果這格不等於 0,BFS 走完相連的格子
for i in range(m):
for j in range(n):
if grid[i][j] != 0:
val = grid[i][j] % k
que = deque([(i, j)])
grid[i][j] = 0
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] != 0:
val = (val + grid[nr][nc]) % k
grid[nr][nc] = 0
que.append((nr, nc))
if val == 0: ans += 1 # 符合條件,答案加 1
return ans