[路飞]_130.被围绕的区域

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

130. 被围绕的区域

题目

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

示例1

image.png

输入: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"]]
复制代码

题解

DFS

分析条件要求:

  • 二维数组元素只有 O , X O, X
  • 边界上的  O O  都不会被填充为  X X
  • 不与边界上的   O O   相连的 O O  会被填充为  X X

看条件和要求感觉这题不是很难。将不与边界上的   O O   相连的 O O  会被填充为  X X ;首先需要筛选出来二维数组元素中那些  O O  是边界上的,那些是与边界  O O  相连的

二维数组相邻元素是否相同,DFS老套路了

  • 枚举二维数组上下左右4个边界
  • 如果边界上存在  O O  ,根据   O O 在二维数组的位置,查询该位置上下左右4个方向是否存在  O O
    • 如果存在 O O ,将此位置的值修改为‘-’,继续根据查到的 O O 的位置,查询该位置上下左右4个方向是否存在  O O ?(递归);
    • 如果不存在 O O ,停止此方向的搜索
  • 二维数组上下左右4个边界修改完毕,枚举二维数组,将二维数组内所有‘-’ 修改为 O O ,其他值修改为 X X

根据上述思路编辑代码如下:

代码

var solve = function (board) {
  const m = board.length
  const n = board[0].length
  const row = [1, -1, 0, 0]
  const col = [0, 0, 1, -1]
  // 左右
  for (let i = 0; i < m; i++) {
    if (board[i][0] === 'O') {
      helper(i, 0)
    }
    if (board[i][n - 1] === 'O') {
      helper(i, n - 1)
    }
  }
  // 上下
  for (let i = 0; i < n; i++) {
    if (board[0][i] === 'O') {
      helper(0, i)
    }
    if (board[m - 1][i] === 'O') {
      helper(m - 1, i)
    }
  }

  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (board[i][j] === '-') {
        board[i][j] = 'O'
      } else {
        board[i][j] = 'X'
      }
    }
  }

  return board

  function helper(i, j) {
    board[i][j] = '-'
    for (let k = 0; k < 4; k++) {
      const x = i + row[k]
      const y = j + col[k]
      if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] === 'O') {
        helper(x, y)
      }
    }
  }
}
复制代码

猜你喜欢

转载自juejin.im/post/7061954325404516383
今日推荐