[C++]Leetcode130.被围绕的区域

it2025-10-11  2

130.被围绕的区域

给定一个二维的矩阵,包含 ‘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’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

class Solution { public: int n, m; //深度优先搜索 void dfs(vector<vector<char>>& board ,int x, int y) { if(x<0 || y<0 || x>= m || y>= n || board[x][y] != 'O') return; board[x][y] = 'A'; dfs(board, x+1, y); dfs(board, x, y+1); dfs(board, x-1, y); dfs(board, x, y-1); } void solve(vector<vector<char>>& board) { //二维矩阵的长 m = board.size(); //长为0时,直接返回 if(m == 0) return ; //二维矩阵的宽 n = board[0].size(); //从边界开始dfs搜索,将与边界的O直接或间接相连的O标记为A //先遍历第一行和最后一行 for(int i = 0; i < m; i++) { dfs(board, i, 0); dfs(board, i, n-1); } //遍历第一列和最后一列,此处要注意! //(由于前面遍历了始末行,所以列从1和n-1开始遍历) for(int i = 1; i < n-1; i++) { dfs(board, 0, i); dfs(board, m-1, i); } //接着遍历整个二维矩阵,将A还原,将O标记为X for(int i = 0; i< m; i++) { for(int j = 0; j < n; j++) { if(board[i][j] == 'A') board[i][j] = 'O'; else if(board[i][j] == 'O') board[i][j] = 'X'; } } } };

时间复杂度:O(n×m),其中 n和 m 分别为矩阵的行数和列数。深度优先搜索过程中,每一个点至多只会被标记一次。 空间复杂度:O(n×m),其中 n和 m分别为矩阵的行数和列数。主要为深度优先搜索的栈的开销。

[[C++]Leetcode超高效刷题顺序及题目详解笔记(持续更新中)]

最新回复(0)