本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、题目描述:
1034. 边界着色 - 力扣(LeetCode) (leetcode-cn.com)
给你一个大小为 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
二、思路分析:
题目的意思是:将一个component的边界方块染色,即将其赋值为color,并返回染色后的Grid
由此牵涉两个定义:
什么是一个component?
什么是一个component的边界方块?
如题意,一个component即上下左右四个方向相邻的同色方块所在区域
一个component的边界方块是要么在第一/最后一行或者列,要么至少跟一个其他区域的方块相邻
解题思路
首先从起始节点开始,DFS
若遇到边界节点,则染色之
三、AC 代码:
class Solution {
public int[][] colorBorder(int[][] grid, int r0, int c0, int color) {
int row = grid.length;
int col = grid[0].length;
int[][] newGrid = new int[row][col]; //在一个新的grid上染色,
int[][] visited = new int[row][col];
//copy data
for(int i =0 ;i< row;i++)
for(int j =0;j< col;j++){
newGrid[i][j] = grid[i][j];
visited[i][j] = 0;
}
dfs(grid,newGrid, visited,r0, c0, grid[r0][c0],color);
return newGrid;
}
void dfs(int[][] grid, int[][] newGrid, int[][] visited,int i , int j, int rawColor, int newColor){
int row = grid.length;
int col = grid[0].length;
if(i< 0 || i > row -1 || j < 0 || j > col -1 || grid[i][j] != rawColor)
return;
if(visited[i][j] == 0 ){
if(isBorder(grid,i,j))
newGrid[i][j] = newColor; //若为边界则染色之
visited[i][j] = 1;
dfs(grid,newGrid,visited,i-1,j,rawColor,newColor);
dfs(grid,newGrid,visited,i+1,j,rawColor,newColor);
dfs(grid,newGrid,visited,i,j-1,rawColor,newColor);
dfs(grid,newGrid,visited,i,j+1,rawColor,newColor);
}
}
boolean isBorder(int[][] grid, int i , int j){
// 判断是否为边界 1.若在网格边界则返回true 2.对于不在网格边界的方块:若四周皆为本区域则返回false,否则返回true
int row = grid.length;
int col = grid[0].length;
int color = grid[i][j]; // rawColor
if(i ==0 || i == row -1 || j ==0 || j == col -1)
return true; //boundary of the grid
if(grid[i-1][j] == color && grid[i+1][j] == color && grid[i][j-1] == color && grid[i][j+1] == color)
return false; //inner grid
else
return true;
}
}