這道題是網格類問題的基礎,也是學習BFS、和DFS的經典題目。
題目連結: 200. Number of Islands
題目描述:給你一個由 '1' (陸地) 和 '0' (水) 組成的 m x n 二維網格 grid。一個「島嶼」是由水平或垂直方向上相鄰的 '1' 連接而成的區域。你可以假設網格的四個邊緣都被水包圍。
請計算網格中島嶼的數量。
Example 1:
Input: grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
Output: 1
上面這個例子中有 1 個獨立的島嶼。
Example 2:
Input: grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
Output: 3
上面這個例子中有 3 個獨立的島嶼。
解題思路:
我們的目標就是找出有幾個這樣互相連接的「1 的集群」。
下面程式碼用DFS方法來做介紹。
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
r, c = len(grid), len(grid[0])
def bfs(row,col):
if 0<=row<r and 0<=col<c and grid[row][col] == '1':
grid[row][col] = '0'
else:
return
bfs(row+1,col)
bfs(row-1,col)
bfs(row,col+1)
bfs(row,col-1)
count = 0
for i in range(r):
for j in range(c):
if grid[i][j] == '1':
bfs(i,j)
count += 1
return count
演算法分析:
複雜度分析:
時間複雜度為 O(m * n)
。
grid[row][col] = '0'
,不會再觸發新的 dfs 呼叫。空間複雜度: O(m * n)
(空間消耗主要來自於遞迴呼叫的堆疊)。
第一次做這類有點陌生
有問題可以底下留言!
下回見!!