包圍的區域 | Medium | LeetCode#130. Surrounded Regions
題目敘述
- 題目難度:
Medium
- 題目描述: 給定一個
m x n
大小的board
,包含兩種字母X
或者O
,目的是捕捉被包圍的區域:
Connected: 一個格子可以與相鄰的格子(水平或垂直)相連
Region: 通過連接每個 O
格子來形成一個區域(Region)
Surround: 如果一個區域的所有 O
格子都能被 X
格子連接,並且該區域中的 O
格子不在矩陣的邊緣上,則該區域被視為被包圍
題目要捕捉被包圍的區域, 將原始矩陣中所有被包圍的
O
替換為X
。 此操作應直接在原始矩陣上進行,無需返回任何值。
解法
一開始的想法
這題我一開始的想法有點偏掉,但這題的意思就是:
- 找出被包圍 Region 並將 Region 中的
O
換成X
- 如果 Region 有接到矩陣邊緣,則不替換成
X
這樣依舊會需要先透過 DFS 或者是 BFS 來先去走訪 connected components (相連的 O
) 這裡可以透過 先從邊緣查找是否有 O
,如果有作爲起點進行 DFS, 找到的Connected components 這都代表是不能轉換成 X
的區域 ,可以先替換成其他符號,之後再走訪一次 board
將轉換成 其他符號的區域變回來,然後將還是 O
的區域轉換成 X
我的解法
1 | class Solution { |
這裡宣告的 dfs
的終止條件會是當當前的 row 或 col 超出陣列範圍,或者當前的格子已經不是 O
,則返回。而在每一格會去將 O
變更為 T
, 這是因為這個 dfs 只用來在以 board
邊緣為起點時才會需要 ,因此走訪的 O
都是不可轉換成 X
的,因此轉成一個不相干的字母 T
。 而在函數 solve
中會先迭代 board
的四個邊緣,如果發現有 O
就作為搜尋起點進行走訪,四個邊都走訪完畢後,接著透過雙層迴圈迭代 board
查找每一格中剩餘的 O
這剩餘的 O
就會是要替換成 X
的格子。而 board
中的所有 T
都要轉換回 O
。 這樣就能夠成功包圍出有效的 region。
執行結果
複雜度
時間複雜度
$O(m \times n)$
空間複雜度
$O(m \times n)$
最壞情況下,DFS 可能會遞迴訪問矩陣中的每個 O
,因此遞迴調用棧的深度最多為矩陣中 O
的數量
假設矩陣中所有元素都是 O
,則遞迴Stackk的空間複雜度為 $O(m \times n)$