题目描述
给你一个大小为 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
题解思路
题目简述
-
题目的意思就是说将连通分量的边界处染色
-
连通的意思是与给定坐标点的颜色相同且位于坐标点上下左右相邻四个坐标之中任意一个
-
如果连通分量所在的坐标属于第一行或者最后一行 或者是第一列或最后一列的话 这样也属于是边界 也要染色
例子1
row=0,col=0,color=3
1 1
1 2
坐标点是第0行第0列 与其连通的分别是第0行第1列 以及第1行第0列 但是由于这两个坐标
一个位于第一行一个位于第一列 也属于边界 所以要染色
因此染色后的矩阵是
3 3
3 2
例子2
row=0,col=1,color=3
1 2 2
2 3 2
坐标点是第0行第1列 与其连通的坐标为(0,2) 与(0,2)连通的坐标点为(1,2) 且
这几个点都位于第一行或者最后一列
而(0,0)坐标点与(0,1)坐标点的因为颜色不同所以不属于连通
因此染色后的矩阵是
1 3 3
2 3 3
例子3
row=1,col=1,color=2
1 1 1
1 1 1
1 1 1
按照上面两个例子来说 染色后的矩阵为
2 2 2
2 1 2
2 2 2
DFS
我们采用DFS深度优先遍历算法 从当前节点开始遍历
- 如果是连通域的边界且位于矩阵的边界(第一行或最后一行 第一列或最后一列)则染色
- 如果是连通域内则记录该点的坐标 遍历该点上下左右的连通域
题解代码
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])
target=grid[row][col]
pos=[(1,0),(-1,0),(0,1),(0,-1)]
visit=set()
visit.add((row,col))
#遍历坐标
def dfs(x,y):
for i,j in pos:
a=x+i
b=y+j
#没有超过矩阵边界
if 0<=a<m and 0<=b<n:
#判断坐标点是否遍历过以及是否为连通域边界
if (a,b) not in visit:
#不是连通域的边界
if grid[a][b]==target:
visit.add((a,b))
dfs(a,b)
#是连通域的边界
else:
grid[x][y]=color
#超过矩阵边界
else:
grid[x][y]=color
dfs(row,col)
return grid