网络异常,图片无法展示
|
「这是我参与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.length
n == board[i].length
1 <= m, n <= 200
board[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-被围绕的区域
如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻