前言
這題是一個經典的 DFS 深度優先搜尋問題,聽說是 FAANG 高頻題(?,目標是在二維陣列裡找到連續出現 1 的範圍 (島嶼),計算島嶼共出現幾個,這題有使用到兩個 for 迴圈加上遞迴,如果遞迴深度是固定的且不隨著輸入的增加而增加,而遞迴的深度和節點訪問僅發生一次,則遞迴的時間複雜度可以被忽略,時間複雜度估算為 O(n),這裡有 JAVA 和 Python 的寫法。
題目
Given an
m x n2D binary gridgridwhich represents a map of'1's (land) and'0's (water), return the number of islands.
An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
給定一個
m x n的 2D 二進制網格grid,他代表'1'是陸地'0'是水的一張地圖,回傳這座島的數量。
一座島被水包圍,通過水平或垂直連結鄰近的土地而形成。你可以認為網格的全部四個邊都被水包圍。
題目連結:https://leetcode.com/problems/number-of-islands/
題目限制
m == grid.lengthn == grid[i].length1 <= m, n <= 300grid[i][j] is '0' or '1'.
範例
1 | Input: grid = [ |
左上角 9 個 1 連續在一起,共 1 座島嶼
1 | Input: grid = [ |
左上角 4 個 1、中間 1 個 1、右下角 2 個 1,共 3 座島嶼
思路&筆記
快速地說是用雙迴圈找到了第一個 1,之後用 DFS 深度優先搜尋找他周圍是不是也是 1,然後當次的 DFS 完整跑完代表這個 Islands 的周圍全都是 0 了,可以用雙迴圈繼續找尋下一個 1 的位置 (第二個 Islands)
- 用雙迴圈依依找尋是 Islands 的索引 (是 1 的元素)
- 找到 Islands 後執行 DFS 深度優先搜尋,去找位於這個 Islands 索引的上下左右的索引是不是也是 1 (連續是 1 代表是同一個 Islands )
- 如果上下左右的索引不是 1 的話,而且自己也不是 1的話直接 return 出去,終止這次的 DFS
- 如果是 1 的話就換成 0,避免之後重複計算
- 執行完當次的 DFS,代表這個 Islands 上下左右都是 0,計算了這個 Islands 的數量後
- 直到雙迴圈再找到下一個 1 才會進去算到第二個 Islands (以此類推)
JAVA 實現
1 | class Solution { |
Python 實現
使用了和 Java 一樣的邏輯執行,換成 Python 的寫法。
1 | class Solution: |
成績
| Language | Runtime | Memory |
|---|---|---|
| Java | 3ms | 47.3MB |
| Python | 274ms | 18.9MB |