1034. 边界着色
给你一个大小为 m x n
的整数矩阵 grid
,表示一个网格。另给你三个整数 row
、col
和 color
。网格中的每个值表示该位置处的网格块的颜色。
两个网格块属于同一 连通分量 需满足下述全部条件:
连通分量的边界 是指连通分量中满足下述条件之一的所有网格块:
请你使用指定颜色 color
为所有包含网格块 grid[row][col]
的 连通分量的边界 进行着色,并返回最终的网格 grid
。
示例 1:
输入:grid = [[1,1],[1,2]], row = 0, col = 0, color = 3 输出:[[3,3],[3,2]]
示例 2:
输入:grid = [[1,2,2],[2,3,2]], row = 0, col = 1, color = 3 输出:[[1,3,3],[2,3,3]]
示例 3:
输入:grid = [[1,1,1],[1,1,1],[1,1,1]], row = 1, col = 1, color = 2 输出:[[2,2,2],[2,1,2],[2,2,2]]
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
1 <= grid[i][j], color <= 1000
0 <= row < m
0 <= col < n
相似题目
原站题解
python3 解法, 执行用时: 40 ms, 内存消耗: 15 MB, 提交时间: 2022-12-09 12:05:41
class Solution: def colorBorder(self, grid: List[List[int]], row: int, col: int, color: int) -> List[List[int]]: m, n = len(grid), len(grid[0]) visited = [[False] * n for _ in range(m)] borders = [] originalColor = grid[row][col] visited[row][col] = True self.dfs(grid, row, col, visited, borders, originalColor) for x, y in borders: grid[x][y] = color return grid def dfs(self, grid, x, y, visited, borders, originalColor): isBorder = False m, n = len(grid), len(grid[0]) direc = ((-1, 0), (1, 0), (0, -1), (0, 1)) for dx, dy in direc: nx, ny = x + dx, y + dy if not (0 <= nx < m and 0 <= ny < n and grid[nx][ny] == originalColor): isBorder = True elif not visited[nx][ny]: visited[nx][ny] = True self.dfs(grid, nx, ny, visited, borders, originalColor) if isBorder: borders.append((x, y))
python3 解法, 执行用时: 48 ms, 内存消耗: 15.1 MB, 提交时间: 2022-12-09 12:05:30
class Solution: def colorBorder(self, grid: List[List[int]], row: int, col: int, color: int) -> List[List[int]]: originalColor = grid[row][col] m, n = len(grid), len(grid[0]) visited = [[False] * n for _ in range(m)] borders = [] direc = ((-1, 0), (1, 0), (0, -1), (0, 1)) q = deque([(row, col)]) visited[row][col] = True while q: x, y = q.popleft() isBorder = False for dx, dy in direc: nx, ny = x + dx, y + dy if not (0 <= nx < m and 0 <= ny < n and grid[nx][ny] == originalColor): isBorder = True elif not visited[nx][ny]: visited[nx][ny] = True q.append((nx, ny)) if isBorder: borders.append((x, y)) for x, y in borders: grid[x][y] = color return grid
java 解法, 执行用时: 2 ms, 内存消耗: 42.4 MB, 提交时间: 2022-12-09 12:05:19
class Solution { public int[][] colorBorder(int[][] grid, int row, int col, int color) { int m = grid.length, n = grid[0].length; boolean[][] visited = new boolean[m][n]; List<int[]> borders = new ArrayList<>(); int originalColor = grid[row][col]; int[][] direc = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; Deque<int[]> q = new ArrayDeque<>(); q.offer(new int[]{row, col}); visited[row][col] = true; while (!q.isEmpty()) { int[] node = q.poll(); int x = node[0], y = node[1]; boolean isBorder = false; for (int i = 0; i < 4; i++) { int nx = direc[i][0] + x, ny = direc[i][1] + y; if (!(nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] == originalColor)) { isBorder = true; } else if (!visited[nx][ny]) { visited[nx][ny] = true; q.offer(new int[]{nx, ny}); } } if (isBorder) { borders.add(new int[]{x, y}); } } for (int i = 0; i < borders.size(); i++) { int x = borders.get(i)[0], y = borders.get(i)[1]; grid[x][y] = color; } return grid; } }
java 解法, 执行用时: 1 ms, 内存消耗: 42.6 MB, 提交时间: 2022-12-09 12:05:07
class Solution { public int[][] colorBorder(int[][] grid, int row, int col, int color) { int m = grid.length, n = grid[0].length; boolean[][] visited = new boolean[m][n]; List<int[]> borders = new ArrayList<>(); int originalColor = grid[row][col]; visited[row][col] = true; dfs(grid, row, col, visited, borders, originalColor); for (int i = 0; i < borders.size(); i++) { int x = borders.get(i)[0], y = borders.get(i)[1]; grid[x][y] = color; } return grid; } private void dfs(int[][] grid, int x, int y, boolean[][] visited, List<int[]> borders, int originalColor) { int m = grid.length, n = grid[0].length; boolean isBorder = false; int[][] direc = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; for (int i = 0; i < 4; i++) { int nx = direc[i][0] + x, ny = direc[i][1] + y; if (!(nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] == originalColor)) { isBorder = true; } else if (!visited[nx][ny]){ visited[nx][ny] = true; dfs(grid, nx, ny, visited, borders, originalColor); } } if (isBorder) { borders.add(new int[]{x, y}); } } }
golang 解法, 执行用时: 8 ms, 内存消耗: 6.4 MB, 提交时间: 2022-12-09 12:04:53
var dirs = []struct{ x, y int }{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} func colorBorder(grid [][]int, row, col, color int) [][]int { m, n := len(grid), len(grid[0]) type point struct{ x, y int } borders := []point{} originalColor := grid[row][col] vis := make([][]bool, m) for i := range vis { vis[i] = make([]bool, n) } var dfs func(int, int) dfs = func(x, y int) { vis[x][y] = true isBorder := false for _, dir := range dirs { nx, ny := x+dir.x, y+dir.y if !(0 <= nx && nx < m && 0 <= ny && ny < n && grid[nx][ny] == originalColor) { isBorder = true } else if !vis[nx][ny] { vis[nx][ny] = true dfs(nx, ny) } } if isBorder { borders = append(borders, point{x, y}) } } dfs(row, col) for _, p := range borders { grid[p.x][p.y] = color } return grid }
golang 解法, 执行用时: 4 ms, 内存消耗: 6.5 MB, 提交时间: 2022-12-09 12:04:41
var dirs = []struct{ x, y int }{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} func colorBorder(grid [][]int, row, col, color int) [][]int { m, n := len(grid), len(grid[0]) type point struct{ x, y int } borders := []point{} originalColor := grid[row][col] vis := make([][]bool, m) for i := range vis { vis[i] = make([]bool, n) } q := []point{{row, col}} vis[row][col] = true for len(q) > 0 { p := q[0] q = q[1:] x, y := p.x, p.y isBorder := false for _, dir := range dirs { nx, ny := x+dir.x, y+dir.y if !(0 <= nx && nx < m && 0 <= ny && ny < n && grid[nx][ny] == originalColor) { isBorder = true } else if !vis[nx][ny] { vis[nx][ny] = true q = append(q, point{nx, ny}) } } if isBorder { borders = append(borders, point{x, y}) } } for _, p := range borders { grid[p.x][p.y] = color } return grid }
javascript 解法, 执行用时: 88 ms, 内存消耗: 45 MB, 提交时间: 2022-12-09 12:04:26
/** * @param {number[][]} grid * @param {number} row * @param {number} col * @param {number} color * @return {number[][]} */ var colorBorder = function(grid, row, col, color) { const m = grid.length, n = grid[0].length; const visited = new Array(m).fill(0).map(() => new Array(n).fill(0)); const borders = []; const originalColor = grid[row][col]; const direc = [[0, 1], [0, -1], [1, 0], [-1, 0]]; const q = []; q.push([row, col]); visited[row][col] = true; while (q.length) { const node = q.pop(); const x = node[0], y = node[1]; let isBorder = false; for (let i = 0; i < 4; i++) { const nx = direc[i][0] + x, ny = direc[i][1] + y; if (!(nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] === originalColor)) { isBorder = true; } else if (!visited[nx][ny]) { visited[nx][ny] = true; q.push([nx, ny]); } } if (isBorder) { borders.push([x, y]); } } for (let i = 0; i < borders.length; i++) { const x = borders[i][0], y = borders[i][1]; grid[x][y] = color; } return grid; };
javascript 解法, 执行用时: 84 ms, 内存消耗: 44.2 MB, 提交时间: 2022-12-09 12:04:13
/** * @param {number[][]} grid * @param {number} row * @param {number} col * @param {number} color * @return {number[][]} */ var colorBorder = function(grid, row, col, color) { const m = grid.length, n = grid[0].length; const visited = new Array(m).fill(0).map(() => new Array(n).fill(0)); const borders = []; const originalColor = grid[row][col]; visited[row][col] = true; dfs(grid, row, col, visited, borders, originalColor); for (let i = 0; i < borders.length; i++) { const x = borders[i][0], y = borders[i][1]; grid[x][y] = color; } return grid; }; const dfs = (grid, x, y, visited, borders, originalColor) => { const m = grid.length, n = grid[0].length; let isBorder = false; const direc = [[0, 1], [0, -1], [1, 0], [-1, 0]]; for (let i = 0; i < 4; i++) { const nx = direc[i][0] + x, ny = direc[i][1] + y; if (!(nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] === originalColor)) { isBorder = true; } else if (!visited[nx][ny]){ visited[nx][ny] = true; dfs(grid, nx, ny, visited, borders, originalColor); } } if (isBorder) { borders.push([x, y]); } }