給定乙個二維矩陣,包含:'x'跟'o'(字母 o)。
找到所有這些'x'在該區域周圍,並將所有這些區域放在'o'跟'x'填充。
例:
x x x x執行函式後,矩陣變為:x o o x
x x o x
x o x x
x x x x解釋:x x x x
x x x x
x o x x
包圍的間隔在邊界上不存在,換言之,在任何邊界上都不存在'o'它們都不會被填充為'x'。任何不在邊界上的東西,或者不在邊界上的東西'o'連線'o'最終將填充為'x'。如果兩個元素在水平或垂直方向上相鄰,則稱它們為“連線”。
我們需要把所有被 X 包圍的 O 都變成 X,標題明確指出,邊緣的所有 O 都不能變成 X。
事實上,我們會發現,除了邊緣的 o 和連線到邊緣 o 的 o 之外,我們不需要變成 x,其他一切都需要變成 x。
經過上述反思,問題轉化為乙個相互關聯的區域問題。 在這裡我們需要標記它邊緣的を和與邊緣相連的を
。當然,我們可以使用額外的空間來儲存它,但對於這個問題,我們可以完全變異。 這樣,空間複雜度會好一點。
整個過程如圖所示:
我會的邊緣的を和與邊緣相連的を
標籤"a"
二維陣列 DFS 解決方案模板轉換問題是連線問題
原有陣列直接變異,節省空間的語言支援:js、python3、cpp
* *lc app=leetcode id=130 lang=j**ascript * 130] 包圍區域 * 將 O 和周圍的 O 轉換為函式標記(board, i, j, rows, cols) ** param board * return 不返回任何內容,改為就地修改板。 */var solve = function (board) for (let i = 0; i < rows; i++)else if (board[i][j] === "a") return board;};
python code:
class solution: def solve(self, board: list[list[str]])none: """ do not return anything, modify board in-place instead. """如果數字的長度或寬度小於或等於 2,則無需替換 if len(board) < = 2 或 len(board[0]) = 2: return row, col = len(board), len(board[0]) def dfs(i, j):"""深度優先演算法(如果符合條件)替換為 a 並進一步測試,否則停止""" if i < 0 or j < 0 or i >= row or j >= col or board[i][j] != 'o': return board[i][j] = 'a'DFS(i - 1, j) DFS(i + 1, j) DFS(i, j - 1) DFS(i, j + 1) 從範圍(行)中 i 的外圍開始: dfs(i, 0) dfs(i, col-1) for j in range(col): dfs(0, j) dfs(row-1, j) 最後完成 i in range(row) 的替換: 對於 j in range(col): 如果板[i][j] =='o': board[i][j] = 'x' elif board[i][j] == 'a': board[i][j] = 'o'
cpp code:
class solution , void dfs(vector> &board, int x, int y) public: void solve(vector>& board) for (int j = 0; j < n; +j) for (auto &row : board)
複雜性分析時間複雜度:$o(行 * 列)$Space複雜度:$o(行 * 列)$