给定一个二维矩阵,包含:'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(行 * 列)$