LeetCode-1034 边界着色
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/coloring-a-border/
题目描述
给你一个大小为 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
解题思路
拿到题目粗略一看就知道这是一道图的遍历问题,想了想单纯的广度优先或者深度优先遍历怎么难度也不会是中等吧,仔细观察了一下测试用例发现用例3存在猫腻,找到了重点词,边界。
好的,那么思路有了,我们来改造一下广度优先遍历吧。
首先我们需要一个访问表,记录这个结点是否已经被访问过,但是这个访问表同时也可以记录这个结点是否是边界,这样,我们在最后时候遍历一遍访问表就可以将边界直接着色了。
创建一个同规模的visited表,-1代表未访问过,1代表是边界,0代表不是边界。
接下来就是广度优先遍历的思路了,在队列中加入起始结点,然后依次遍历队列,依次判断上下左右四个结点是不是联通,如果联通且没有访问过就加入队列,同时,通过这四个结点还可以顺便判断当前结点是不是边界。
广度优先遍历结束后,我们遍历一遍visited表,将visited表中数值是1的坐标对应的原图颜色染成题目中的color就好了。
源码展示
class Solution {
public:
vector<vector<int>> colorBorder(vector<vector<int>>& grid, int row, int col, int color) {
vector<vector<int>> vviNewGrid = grid;
vector<vector<int>> vviVisited;
queue<pair<int,int>> qpiiVisiting;
int iM = vviNewGrid.size();
int iN = vviNewGrid[0].size();
int iColor = vviNewGrid[row][col];
vviVisited.resize(iM);
for(int i=0; i<iM; i++)
{
vviVisited[i].resize(iN, -1);
}
qpiiVisiting.push({row, col});
while(!qpiiVisiting.empty())
{
int bBonudary = 0;
int iX = qpiiVisiting.front().first;
int iY = qpiiVisiting.front().second;
qpiiVisiting.pop();
if(iX - 1 >= 0)
{
if(vviVisited[iX - 1][iY] == -1)
{
if(iColor == vviNewGrid[iX - 1][iY])
{
qpiiVisiting.push({iX - 1, iY});
}
else
{
bBonudary = 1;
}
}
}
else
{
bBonudary = 1;
}
if(iX + 1 < iM)
{
if(vviVisited[iX + 1][iY] == -1)
{
if(iColor == vviNewGrid[iX + 1][iY])
{
qpiiVisiting.push({iX + 1, iY});
}
else
{
bBonudary = 1;
}
}
}
else
{
bBonudary = 1;
}
if(iY - 1 >= 0)
{
if(vviVisited[iX][iY - 1] == -1)
{
if(iColor == vviNewGrid[iX][iY - 1])
{
qpiiVisiting.push({iX, iY - 1});
}
else
{
bBonudary = 1;
}
}
}
else
{
bBonudary = 1;
}
if(iY + 1 < iN)
{
if(vviVisited[iX][iY + 1] == -1)
{
if(iColor == vviNewGrid[iX][iY + 1])
{
qpiiVisiting.push({iX, iY + 1});
}
else
{
bBonudary = 1;
}
}
}
else
{
bBonudary = 1;
}
vviVisited[iX][iY] = bBonudary;
}
for(int i = 0; i < iM; i++)
{
for(int j = 0; j < iN; j++)
{
if(vviVisited[i][j] == 1)
{
vviNewGrid[i][j] = color;
}
}
}
return vviNewGrid;
}
};
运行结果

LeetCode-1034 边界着色的更多相关文章
- 【leetcode 5040. 边框着色】解题报告
方法一:dfs的非递归形式 using ll=long long; const ll MAXN=50LL; unordered_set<ll> vis,mark; vector<ve ...
- LeetCode 1034. Coloring A Border
原题链接在这里:https://leetcode.com/problems/coloring-a-border/ 题目: Given a 2-dimensional grid of integers, ...
- Leetcode题解 - DFS部分题目代码+思路(756、1034、1110、491、721、988)
756. 金字塔转换矩阵 """ 学到的新知识: from collections import defaultditc可以帮我们初始化字典,不至于取到某个不存在的值的时 ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- (整)Unreal渲染模块 框总览
@author: 黑袍小道 随缘查看 说明 由于搬山的渲染这部分担心自己理解错误,故而搬移官方下,后面整个完成再反过来更新 (这当且仅当做Unreal的帮助文档). 图形编程 模块 渲 ...
- [LeetCode] Boundary of Binary Tree 二叉树的边界
Given a binary tree, return the values of its boundary in anti-clockwise direction starting from roo ...
- [LeetCode] 545. Boundary of Binary Tree 二叉树的边界
Given a binary tree, return the values of its boundary in anti-clockwise direction starting from roo ...
- [LeetCode] 系统刷题1_代码风格及边界
代码风格 说自己不清楚的算法,比如KMP,如果解释不清楚或者写不出来的算法建议不提 注意代码的缩进以及空格的合理运用,使得代码看起来比较整洁有条理 注意边界的条件以及越界 误区: 算法想出来还仅仅不够 ...
- 【leetcode】1034. Coloring A Border
题目如下: Given a 2-dimensional grid of integers, each value in the grid represents the color of the gri ...
- Java实现 LeetCode 605 种花问题(边界问题)
605. 种花问题 假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种 ...
随机推荐
- SpringBoot中搭配AOP实现自定义注解
1 springBoot的依赖 确定项目中包含可以注解的依赖 <dependency> <groupId>org.springframework.boot</groupI ...
- 为什么总是应该考虑给定 List 的初始大小
在 .Net 技术中,使用 List<> 来存储数据是很常见的.List<> 是一个可以动态增长的泛型集合类型,可以存储任何类型的数据. 但是,在实际使用中,很多人并不注意给定 ...
- 解决SpringMVC重定向参数无法携带问题
解决SpringMVC重定向参数无法携带问题 场景 重定向时请求参数会丢失,我们往往需要重新携带请求参数,我们可以进⾏⼿动参数拼接如下: return "redirect:handle01? ...
- 前端(js部分讲解)
BOM操作 BOM概念 BOM:Browser Object Model 是浏览器对象模型,浏览器对象模型提供了独立与内容的.可以与浏览器窗口进行互动的对象结构,BOM由多个对象构成,其中代表浏览器窗 ...
- 前端知识之JS(javascirpt)
目录 JS简介 JS基础 1.注释语法 2.引入JS的多种方式 3.结束符号 变量与常量 基本数据类型 1.数字类型(Number) 2.字符类型(string) 3.布尔类型(Boolean) 4. ...
- MySQL简介、下载、密码修改及基本使用
目录 存取数据的演变史 数据库软件应用史 数据库的本质 数据库的分类 MySQL简介 MySQL基本使用 系统服务的制作 密码相关操作 SQL与NoSQL 数据库重要概念 基本SQL语句 存取数据的演 ...
- 单例模式及pickle序列化模块
内容回顾 目录 内容回顾 单列模式实现的多种方式 pickle序列化模块 根据类名或对象名如何获取到类的字符串名 选课系统需求分析 功能提炼 选课系统架构设计 选课系统目录搭建 单列模式实现的多种方式 ...
- python里面一些零碎知识点
1. Python中反斜杠可以用在一行结尾做续行符使用. 2. pytorch中,一般来说如果对tensor的一个函数后加上了下划线,则表明这是一个in-place类型.in-place类型是指,当在 ...
- C/C++语言 MD5例子
之前研究了一下在C中进行MD5加密,由于找了很久没有找到现成的库文件,所以所幸自己去写了一下.个人感觉C的便捷性没有Python好的原因就是这里. 下面是我写的一个例子. mian.cpp: 点击查看 ...
- Apache Kafka 的基本概念
基本概念 主题 Topic topic 是 Kafka 最基础的组织单位,类似于关系数据库中的数据表.做为使用 kafka 的开发者,你最应该考虑的是和 topoc 相关的抽象.创建不同的 topic ...