題目描述:給定一個由 'X' 和 'O' 組成的二維字元板,將所有被 'X' 完全包圍的 'O' 區域翻轉為 'X'。邊界上的 'O' 以及與邊界 'O' 相連的 'O' 不應被翻轉。
解題思路:直接判斷哪些 'O' 被包圍較為困難,採取逆向思考更為巧妙:標記「安全的 'O'」(即不會被翻轉的),剩下的就是要翻轉的。凡是與邊界相連的 'O' 都是安全的。步驟:①從四條邊界的所有 'O' 出發,做 DFS/BFS,將可達的 'O' 臨時標記為 'S'(安全);②掃描整個板,將剩餘的 'O' 翻轉為 'X',將 'S' 還原為 'O'。
時間複雜度:O(m × n) — 邊界 DFS 與最終掃描各最多訪問每個格子一次,m 和 n 分別為行數與列數。
空間複雜度:O(m × n) — 最壞情況下(全為 'O')DFS 遞迴堆疊深度為 m × n。使用迭代 BFS 可以同樣的空間上限但避免堆疊溢出。
1. For each cell on the 4 borders: a. If cell == 'O': run DFS to mark all connected 'O's as 'S' 2. DFS(r, c): a. If out of bounds or board[r][c] != 'O': return b. Set board[r][c] = 'S' c. Recurse in 4 directions 3. Scan entire board: a. 'O' -> 'X' (surrounded, flip) b. 'S' -> 'O' (safe, restore) c. 'X' -> 'X' (unchanged)
Union-Find O(m×n × α):將所有 'O' 格子以及一個虛擬「邊界節點」納入 Union-Find。每個邊界上的 'O' 與虛擬節點合併;相鄰 'O' 互相合併。最後,與虛擬節點不同根的 'O' 即為被包圍的格子。
迭代 BFS O(m×n):邏輯與 DFS 相同,但使用佇列取代遞迴,完全避免呼叫堆疊過深的問題,適合超大網格。
'O' 區域會從「被包圍」變成「安全」?'O' 總數,而不修改原始板?