200. Number of Islands
1.題目解題思路:把整個 grid 想像成一張二維地圖,每個 '1' 是「陸地」,每個 '0' 是「水」。題目要我們找出多少個不連通的陸地塊(島嶼)。
- 一個島嶼的定義是:由相鄰的 '1' 組成的一塊區域(只能上下左右相鄰,不算斜的)。
2.解題策略
我們要找出這張地圖中有幾個島嶼。也就是說:
每當我們遇到一塊新的 '1',就代表我們發現了一個新島嶼,接下來的任務是把這整塊島嶼(所有連通的 '1')標記成已處理,避免之後重複計數。
這樣一來,我們只要:
1.遍歷整個 grid
2.每當遇到一個 '1':
- 計數 +1
- 把這塊陸地連通的 '1' 都標記為 '0'(等於「沉沒」它)
3.標記連通區塊
可以用兩種圖遍歷方式:
- DFS(深度優先搜尋)
遇到 '1',就往上下左右遞迴探索,遇到 '1' 就繼續。
用遞迴方式搜尋整塊島,並把它們設為 '0'。
- BFS(廣度優先搜尋)
用 Queue 來存座標,一層一層往外擴展,把所有 '1' 都變成 '0'。
適合於逐層探索,但這題其實 DFS 或 BFS 都可以。
3.範例解析
範例:
grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
1.從左上開始,第 (0,0) 是 '1' → 新島嶼,開始 DFS 把它和相鄰的 '1' 全部設為 '0'
2.接著到 (2,2) 是孤立的 '1' → 又是一個新島嶼
3.到 (3,3) 是新的 '1',旁邊還有 (3,4) 是 '1' → 這是一個島嶼
4最後結果是:3 個島嶼
4.程式碼截圖(這次採用DFS解法):
5.BFS vs DFS 比較:
| 特性 | DFS | BFS |
| 搜索方式 | 遞迴(或用 Stack) | Queue |
| 記憶體 | 遞迴堆疊可能較深 | Queue 控制較好 |
| 適合用在哪裡 | 深度分析、所有節點處理完再回頭 | 分層遍歷、找最短路徑 |
| 本題適用性 | 兩種都可以(不需找最短距離) | BFS 也很合適 |
6.學習心得:此次選的題目我覺得有難度,在看第一變的時候有點不知所措,後來就自己嘗試理解題目,也藉由AI的幫忙讓我可以比較理解,也比較知道解題方向,之後我會多嘗試做這類相關的題目,讓自己練習。