[路飞]_leetcode-130-被围绕的区域

简介: leetcode-130-被围绕的区域

网络异常,图片无法展示
|


「这是我参与2022首次更文挑战的第31天,活动详情查看:2022首次更文挑战


[题目地址][B站地址]


给你一个 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-被围绕的区域


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章
|
存储 JavaScript 前端开发
|
存储 算法
[路飞]_leetcode-面试题 04.08-首个共同祖先
leetcode-面试题 04.08-首个共同祖先