每日一题---1034. 边界着色[力扣][Go]

简介: 每日一题---1034. 边界着色[力扣][Go]

题目描述

给你一个大小为 m x n 的整数矩阵 grid ,表示一个网格。另给你三个整数 row、col 和 color 。网格中的每个值表示该位置处的网格块的颜色。

当两个网格块的颜色相同,而且在四个方向中任意一个方向上相邻时,它们属于同一 连通分量 。

连通分量的边界 是指连通分量中的所有与不在分量中的网格块相邻(四个方向上)的所有网格块,或者在网格的边界上(第一行/列或最后一行/列)的所有网格块。

请你使用指定颜色 color 为所有包含网格块 grid[row][col] 的 连通分量的边界 进行着色,并返回最终的网格 grid 。

解题代码

  1. 深度搜索
// 定义方向
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
}
  1. 广度搜索
// 定义方向
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
}

我们数据结构课上讲到了深度搜索和广度搜索,但是没有用过,正好今天力扣这一题有深刻的让我认识到

提交结果

两次运行结果都为:


相关文章
|
6月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
59 6
|
6月前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
42 8
每日一题 --- 942. 增减字符串匹配[力扣][Go]
每日一题 --- 942. 增减字符串匹配[力扣][Go]
每日一题 --- 942. 增减字符串匹配[力扣][Go]
|
算法 Go
每日一题 --- 442. 数组中重复的数据[力扣][Go]
每日一题 --- 442. 数组中重复的数据[力扣][Go]
每日一题 --- 442. 数组中重复的数据[力扣][Go]
每日一题 --- 933. 最近的请求次数[力扣][Go]
每日一题 --- 933. 最近的请求次数[力扣][Go]
每日一题 --- 933. 最近的请求次数[力扣][Go]
每日一题 --- 713. 乘积小于 K 的子数组[力扣][Go]
每日一题 --- 713. 乘积小于 K 的子数组[力扣][Go]
每日一题 --- 713. 乘积小于 K 的子数组[力扣][Go]
每日一题 --- 606. 根据二叉树创建字符串[力扣][Go]
每日一题 --- 606. 根据二叉树创建字符串[力扣][Go]
每日一题 --- 606. 根据二叉树创建字符串[力扣][Go]
|
Go 索引
每日一题 ---- 599. 两个列表的最小索引总和[力扣][Go]
每日一题 ---- 599. 两个列表的最小索引总和[力扣][Go]
每日一题 ---- 599. 两个列表的最小索引总和[力扣][Go]
|
存储 测试技术 Go
每日一题 --- 393. UTF-8 编码验证[力扣][Go]
每日一题 --- 393. UTF-8 编码验证[力扣][Go]
每日一题 --- 393. UTF-8 编码验证[力扣][Go]
每日一题 --- 590. N 叉树的后序遍历[力扣][Go]
每日一题 --- 590. N 叉树的后序遍历[力扣][Go]
每日一题 --- 590. N 叉树的后序遍历[力扣][Go]