题目来源:力扣(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 边界着色的更多相关文章

  1. 【leetcode 5040. 边框着色】解题报告

    方法一:dfs的非递归形式 using ll=long long; const ll MAXN=50LL; unordered_set<ll> vis,mark; vector<ve ...

  2. LeetCode 1034. Coloring A Border

    原题链接在这里:https://leetcode.com/problems/coloring-a-border/ 题目: Given a 2-dimensional grid of integers, ...

  3. Leetcode题解 - DFS部分题目代码+思路(756、1034、1110、491、721、988)

    756. 金字塔转换矩阵 """ 学到的新知识: from collections import defaultditc可以帮我们初始化字典,不至于取到某个不存在的值的时 ...

  4. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  5. (整)Unreal渲染模块 框总览

    @author: 黑袍小道 随缘查看     说明 由于搬山的渲染这部分担心自己理解错误,故而搬移官方下,后面整个完成再反过来更新 (这当且仅当做Unreal的帮助文档).     图形编程 模块 渲 ...

  6. [LeetCode] Boundary of Binary Tree 二叉树的边界

    Given a binary tree, return the values of its boundary in anti-clockwise direction starting from roo ...

  7. [LeetCode] 545. Boundary of Binary Tree 二叉树的边界

    Given a binary tree, return the values of its boundary in anti-clockwise direction starting from roo ...

  8. [LeetCode] 系统刷题1_代码风格及边界

    代码风格 说自己不清楚的算法,比如KMP,如果解释不清楚或者写不出来的算法建议不提 注意代码的缩进以及空格的合理运用,使得代码看起来比较整洁有条理 注意边界的条件以及越界 误区: 算法想出来还仅仅不够 ...

  9. 【leetcode】1034. Coloring A Border

    题目如下: Given a 2-dimensional grid of integers, each value in the grid represents the color of the gri ...

  10. Java实现 LeetCode 605 种花问题(边界问题)

    605. 种花问题 假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种 ...

随机推荐

  1. 关于解决pip安装python第三方库超时的问题

    直接换源下载 1. 设置超时时间,安装txt 文件内安装包 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --default-time ...

  2. MYSQL下载 环境配置 修改密码 基本SQL语句

    目录 存取数据的演变史 数据库软件应用史 数据库的本质 数据库的分类 关系型数据库 特征 常见关系型数据库 非关系型数据库 特征 常见非关系型数据库 mysql简介 mysql下载 启动mysql 系 ...

  3. 学习Django框架之前所需要了解的知识点

    目录 一: Web应用 1.Web应用程序什么? 2.软件开发架构 3.Web应用程序的优点 4.Web应用程序的缺点 5.B/S架构优点 6.Web框架本质 二:MVC和MTV模式 1.MVC设计模 ...

  4. 解决.net Core中WebApi自动Model验证导致数据格式不能统一

    简言: 最近做项目用WebAPI Core时,想把返回数据的格式,统一弄成:{"errorMsg":"xxx","Data":"x ...

  5. Python函数用法和底层分析

    目录 Python函数用法和底层分析 函数的基本概念 Python 函数的分类 核心要点 形参和实参 文档字符串(函数的注释) 返回值 函数也是对象,内存底层分析 变量的作用域(全局变量和局部变量) ...

  6. 2022年7月13日,第四组 周鹏 JAVA认识的第一天,附加一个用JS写的计算器代码

    心情:╭(╯^╰)╮ ╮(╯﹏╰)╭ (╯﹏╰)b 罒ω罒 |*´Å`)ノ ( Ĭ ^ Ĭ ) (ㄒoㄒ) o(╥﹏╥)o /(ㄒoㄒ)/~~ (〒︿〒) ┭┮﹏┭┮ ε(┬┬﹏┬┬)3 ε(┬┬﹏┬ ...

  7. netcore下死RabbitMQ队列、死信队列、延时队列及小应用

    关于安装rabbitmq这里一笔掠过了. 下面进入正题: 1.新建aspnetcorewebapi空项目,NormalQueue,删除controllers文件夹已经无关的文件,这里为了偷懒不用con ...

  8. Proxyless Mesh 在 Dubbo 中的实践

    背景 随着 Dubbo 3.1 的 release,Dubbo 在云原生的路上又迈出了重要的一步.在这个版本中添加了 Proxyless Mesh 的新特性,Dubbo Proxyless Mesh ...

  9. vulnhub靶场之IA: KEYRING (1.0.1)

    准备: 攻击机:虚拟机kali.本机win10. 靶机:IA: KEYRING (1.0.1),下载地址:https://download.vulnhub.com/ia/keyring-v1.01.o ...

  10. 既然有MySQL了,为什么还要有MongoDB?

    大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦? 让我们一起,一探究竟,了解一下MongoDB的特点和基本用法 ...