LeetCode刷题日记2021-12-7/1034. 边界着色-DFS深度优先搜素

2023-11-07

1034. 边界着色-DFS深度优先搜素

题目描述

给你一个大小为 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode刷题日记2021-12-7/1034. 边界着色-DFS深度优先搜素 的相关文章

随机推荐

  • verilog学习笔记(1)module实例化

    兜兜转转又回来学硬件了 哎 命啊 我的答案 有bug module top module input a input b output out wire w1 wire w2 wire w3 mod a mod a inst1 in1 w1
  • IDEA引入JDK/jar包无效、java 文件灰色右下角橙色java图标显示等问题解决办法

    一 引入jdk jar包无效 IDEA有时候会出现引入jdk无效的情况 import灰色 代码爆红 这是因为idea检测发现包并没有导入进来 1 如果是普通java项目 jdk等都配置好还是这样的话 可以通过 清除缓存并重启的方式解决 如下
  • k8s的1.20.15的kubeadm安装教程

    k8s的1 20 15的kubeadm安装教程 1 基础环境配置 1 1 配置信息 系统版本 centOS7 9 docker版本 19 03 x kubernetes 1 20 x Pod网段 172 168 0 0 16 service
  • Fiddler下载安装 Mac版

    目录 下载 安装 下载 1 进入FiddlerDownload Fiddler Web Debugging Tool for Free by Telerik下载网站 点击 Try Fiddler Everywhere 2 我这里选择的是ma
  • 【Spring Boot 初识丨一】入门实战

    学习前提 学习Spring Boot的前提是具备Java编程基础 包括面向对象编程 Java集合框架 异常处理 多线程等基本概念和技能 此外 还需要了解Web开发的基本知识 例如HTTP协议 Servlet JSP HTML CSS Jav
  • 《eNSP - OSPF 查看命令》

    display ospf peer 查看 OSPF 邻居的相关信息 display ip routing table protocol ospf 查看 OSPF 协议路由表 display ospf interface 查看运行 OSPF
  • LeetCode-二进制中1的个数

    计算机中的补数是 两个数加起来等于在二进制里一个非常整的数 比如 加起来等于 10000000000000000000000000000000000这样的 1 01 的补数 111111111111111111111111111111111
  • springboot封装响应实体

    前言 首先什么是响应实体 正常我们的后端都是接收前端 然后把请求需要的数据返回给前端 而这个返回的数据就是我们的响应实体 那么 为什么我们需要进行封装响应实体呢 第一点 最明显的就是 为了人机友好交互 如果单单只是把返回的数据给到前端 有数
  • Leetcode53/152—最大子数组和/最大子数组乘积(状态转移方程/不熟)

    53 最大子数组和 给你一个整数数组 nums 请你找出一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 子数组 是数组中的一个连续部分 思路 aaaaa 我老不会这个题 动态规划的是首先对数组进行遍历 当前最大连续子序列和
  • 什么是Spring三级缓存 对象在三级缓存中的创建流程 【三级缓存 循环依赖】

    一 什么是Spring三级缓存 第一级缓存 也叫单例池 存放已经经历了完整生命周期的Bean对象 第二级缓存 存放早期暴露出来的Bean对象 实例化以后 就把对象放到这个Map中 Bean可能只经过实例化 属性还未填充 第三级缓存 存放早期
  • Confluence不仅仅是一个wiki,它还可以是一个应用系统平台。

    利用Confluence插件系统 可以很容易地定制和扩展Confluence来满足您的需要 下面是Confluence开发者社区所开发的一些被广泛使用的插件 我们提供了一个包含了更多插件的库 您甚至可以去开发自己的插件 Office Con
  • JavaScript从题学习——预解析案例

    前言 从题中快速了解和复习下变量提升 函数提升 作用域链 预解析案例 答案在最后 案例1 var num 10 fun function fun console log num var num 20 相当于执行了以下操作 var num f
  • 1024 程序员节:低代码低成本硬件 - 树莓派 Pico 2040

    恰逢 1024 程序员节 程序员们忙着开交流会 或者写代码 来庆祝节日 或者随便写点什么 留下自己的足迹 CSDN 组织了好几个线下 线上的会 大家也在讨论开源 开放 小米的崔总 引用了 论语 里的一句话 德不孤 必有邻 来评价正确的开源之
  • 判断回文串C++

    题目描述 输入一串字符 字符个数不超过1000 判断它们是否构成回文 所谓回文字符串 就是一个字符串 从左到右读和从右到左读是完全一样的 比如 level aaabbaaa 输入 输入只有一行 包括一串字符 输出 输出只有一行TRUE或者F
  • 从mysql数据库中读取二进制文件_ASP中从数据库读取二进制文件数据代码

    driver name1 DRIVER Microsoft Access Driver mdb DBQ D 数据库 TREE MDB 根目录下数据库打开语句 dim search rs j search select from Files
  • 关于图像处理技术检测火焰的一些建议(仅个人观点)

    1 火焰检测是图像识别的一个细类 某种意义上图像识别的技术都可以用于火焰检测 因此如帧间差分法 RGB方法等都可直接搜相应方法获得源码 直接用于火焰检测 微调参数即可 当然这种检测结果是不佳的 2 火焰检测需要认清到底是要检测动态火焰还是静
  • Vue3打印功能

    目录 安装 vue3 print nb main js中引入 vue3 print nb 页面内引入 声明打印时的配置的变量 选择要打印的模板区域 配置对应的id包裹 配置完成了看效果 点击打印出现打印模态框 安装 vue3 print n
  • 002_Kubernetes安装配置

    文章目录 1 k8s环境平台规划 1 1 单master集群 1 2 多master集群 2 配置要求 3 Kubernetes集群主要有两种方式 3 1 kubeadm 3 2 二进制包 4 kubeadm kubectl kubelet
  • JS手写实现发布订阅设计模式

    大部分前端应该对设计模式了解都不多 但是对Vue理解深刻的同学一定都知道发布订阅模式 因为Vue2的响应式就是基于Object defineProperty 发布订阅模式实现的 今天我们就用JS简单实现一下发布订阅模式 观察者 watche
  • LeetCode刷题日记2021-12-7/1034. 边界着色-DFS深度优先搜素

    1034 边界着色 DFS深度优先搜素 题目描述 题解思路 题解代码 题目描述 给你一个大小为 m x n 的整数矩阵 grid 表示一个网格 另给你三个整数 row col 和 color 网格中的每个值表示该位置处的网格块的颜色 当两个