2021-12-7(LeetCode每日一题)

137 阅读1分钟

边界着色

image.png

题目分析

  • 根据题意这是一道图论搜索题,我们从(row,col)(row,col)出发向上下左右四个方向进行BFS或者DFS搜索,判断(row,col)(row,col)是不是连通分量的边界,如果是边界为当前格子上色。搜索的过程中要对已经搜索过的格子进行记录,防止进入死循环。

代码

let colorBorder = function (grid, row, col, color) {
  const targetColor = grid[row][col];
  const m = grid.length - 1;
  const n = grid[0].length - 1;
  const result = JSON.parse(JSON.stringify(grid));
  const dfs = (row, col) => {
    if (grid[row][col] !== targetColor) {
      return;
    }
    grid[row][col] *= -1;
    if (
      row === 0 ||
      row === m ||
      col === 0 ||
      col === n ||
      Math.abs(grid[row - 1][col]) !== targetColor ||
      Math.abs(grid[row + 1][col]) !== targetColor ||
      Math.abs(grid[row][col - 1]) !== targetColor ||
      Math.abs(grid[row][col + 1]) !== targetColor
    ) {
      result[row][col] = color;
    }
    if (row > 0) {
      dfs(row - 1, col);
    }
    if (row < m) {
      dfs(row + 1, col);
    }
    if (col > 0) {
      dfs(row, col - 1);
    }
    if (col < n) {
      dfs(row, col + 1);
    }
  };
  dfs(row, col);
  return result;
};