「这是我参与2022首次更文挑战的第31天,活动详情查看:2022首次更文挑战」
给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。
示例 1:
输入: board = [["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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
示例 2:
输入: board = [["X"]]
输出: [["X"]]
提示:
m == board.lengthn == board[i].length1 <= m, n <= 200board[i][j]为'X'或'O'
解题思路
本题要求我们将被环绕的 O 改为 X。
最直接的方式是获取被环绕的 O,将它们改为 X,但是判断哪些 O 被环绕其实是有些麻烦的,所以我们可以换一种思路。
我们去找没有被环绕的 O,则剩余的就是被环绕的 O。判断哪些 O 没有被环绕相对简单很多,因为没有被环绕的 O 中必须保证有一个区域是在边上的,所以我们只需要扫描矩阵的四条边,如果有 O,则其没有被环绕,而与之相连的 O 也没有被环绕,给这些区域做上标记,接下来扫描整个矩阵,将没有做标记的 O 改为 X即可。
代码实现
var solve = function(board) {
// 获取矩阵的纵向长度和横向长度
const m = board.length,n = board[0].length;
// 将没有被环绕的 O 打上标记
function tag(i,j){
// 如果当前坐标不合法或者当前区域不是 O,直接返回
if(i<0 || i>=m || j<0 || j>=n || board[i][j]!=='O') return;
// 将当前区域打上标记
board[i][j] = 'A'
// 处理与之相连的区域
tag(i-1,j)
tag(i+1,j)
tag(i,j-1)
tag(i,j+1)
}
// 上
for(let j = 0;j<n;j++) tag(0,j)
// 下
for(let j = 0;j<n;j++) tag(m-1,j)
// 左
for(let i = 0;i<m;i++) tag(i,0)
// 右
for(let i = 0;i<m;i++) tag(i,n-1)
// 扫描矩阵,将没有标记的 O 改为 X,被标记的 O 保持为 O
for(let i = 0;i<m;i++){
for(let j = 0;j<n;j++){
if(board[i][j]==='O') board[i][j] = 'X'
if(board[i][j]==='A') board[i][j] = 'O'
}
}
};
至此我们就完成了 leetcode-130-被围绕的区域
如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻