题目描述
给你一个大小为 m x n 的整数矩阵 grid ,表示一个网格。另给你三个整数 row、col 和 color 。网格中的每个值表示该位置处的网格块的颜色。
当两个网格块的颜色相同,而且在四个方向中任意一个方向上相邻时,它们属于同一 连通分量 。
连通分量的边界 是指连通分量中的所有与不在分量中的网格块相邻(四个方向上)的所有网格块,或者在网格的边界上(第一行/列或最后一行/列)的所有网格块。
请你使用指定颜色 color 为所有包含网格块 grid[row][col] 的 连通分量的边界 进行着色,并返回最终的网格 grid 。
解题代码
- 深度搜索
// 定义方向
var dirs = []struct{x,y int}{{0,1},{1,0},{-1,0},{0,-1}}
func colorBorder(grid [][]int, row int, col int, color int) [][]int {
m,n := len(grid),len(grid[0])
type point struct{ x, y int }
//borders 用来存边界的横坐标和纵坐标
borders := []point{}
//initialColor 用来记录初始颜色
initialColor := grid[row][col]
//visit 记录是否被访问过
visit := make([][]bool,m)
for i, _ := range visit {
visit[i] = make([]bool,n)
}
//深度搜索函数
var dfs func(int,int)
dfs = func(x,y int) {
visit[x][y] = true
isBorders := false
for _, dir := range dirs {
nx,ny := x+dir.x,y+dir.y
// 判断边界条件
if !(nx < m && nx >= 0 && ny < n && ny >= 0 && grid[nx][ny] == initialColor) {
isBorders = true
} else if !visit[nx][ny] {
visit[nx][ny] = true
dfs(nx,ny)
}
}
if isBorders {
borders = append(borders, point{x,y})
}
}
dfs(row, col)
// 将是边界的点涂上颜色
for _, border := range borders {
grid[border.x][border.y] = color
}
return grid
}
- 广度搜索
// 定义方向
var dirs = []struct{x,y int}{{0,1},{1,0},{-1,0},{0,-1}}
func colorBorder(grid [][]int, row int, col int, color int) [][]int {
m,n := len(grid),len(grid[0])
type point struct{ x, y int }
//borders 用来存边界的横坐标和纵坐标
borders := []point{}
//initialColor 用来记录初始颜色
initialColor := grid[row][col]
//visit 记录是否被访问过
visit := make([][]bool,m)
for i, _ := range visit {
visit[i] = make([]bool,n)
}
// 广度搜素,使用队列实现
q := []point{{row,col}}
visit[row][col] = true
for len(q) > 0 {
p := q[0]
q = q[1:]
isBorders := false
for _, dir := range dirs {
nx,ny := dir.x + p.x,dir.y + p.y
if !(nx < m && nx >= 0 && ny < n && ny >=0 && grid[nx][ny] == initialColor) {
isBorders = true
} else if !visit[nx][ny] {
visit[nx][ny] = true
q = append(q, point{nx,ny})
}
}
if isBorders {
borders = append(borders, point{p.x,p.y})
}
}
// 将是边界的点涂上颜色
for _, border := range borders {
grid[border.x][border.y] = color
}
return grid
}
我们数据结构课上讲到了深度搜索和广度搜索,但是没有用过,正好今天力扣这一题有深刻的让我认识到
提交结果
两次运行结果都为: