题目来源:力扣(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. Day34:BigDecimal的使用

    BigDecimal 在基本数据类型中对于浮点数的计算时会出现精度丢失的情况,这个时候我们采用BigDecimal类来解决精度丢失的问题. public class Test{ public stat ...

  2. 实用!7个强大的Python机器学习库!⛵

    作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/artic ...

  3. windows7系统中安装deepin系统虚拟机

    在windows系统中安装虚拟机首先需要在widows上下载并安装虚拟机创建工具VMware.这里用的工具版本是 VMware-workstation-full-9.0.2-1031769_www.s ...

  4. 解决MySQL Connector/ODBC驱动无法安装Error1918

    1.问题描述 我在一台windows服务器上安装好mysql之后,再安装mysql的ODBC连接驱动时,报错如下: 2.解决方法 之所以出现安装失败是由于缺少Miscrosoft Visual C++ ...

  5. Spark详解(07) - SparkStreaming

    Spark详解(07) - SparkStreaming SparkStreaming概述 Spark Streaming用于流式数据的处理. Spark Streaming支持的数据输入源很多,例如 ...

  6. Hive详解(02) - Hive 3.1.2安装

    Hive详解(02) - Hive 3.1.2安装 安装准备 Hive下载地址 Hive官网地址:http://hive.apache.org/ 官方文档查看地址:https://cwiki.apac ...

  7. ONNX模型分析与使用

    本文大部分内容为对 ONNX 官方资料的总结和翻译,部分知识点参考网上质量高的博客. 一,ONNX 概述 深度学习算法大多通过计算数据流图来完成神经网络的深度学习过程. 一些框架(例如CNTK,Caf ...

  8. cmd/批处理常用命令

    启动新窗口执行命令 ::执行完毕以后,新开的窗口不会自动关闭 start cmd /k echo 123 ::执行完毕以后,新开的窗口会自动关闭 start cmd /C "echo 123 ...

  9. 软件安装——idea的安装和使用

    Idea的安装和使用 一.下载和安装 下载步骤 官网下载地址:Download IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBr ...

  10. [C++]我的理解之内存对齐

    问题1:为什么要内存对齐? 平台原因:不是所有的平台都能访问到任意地址上的任何数据,如果在特定的地址上找不到数据的话就会抛出硬件异常. 性能问题:简单的来说如果没有使用内存对齐的话,相对于内存对齐,C ...