【图论刷题-3】力扣 733. 图像渲染

2024-01-13 04:08

本文主要是介绍【图论刷题-3】力扣 733. 图像渲染,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图论刷题

  1. 机器人的运动范围
  2. 矩阵中的路径
  3. 图像渲染
  4. 水位上升的泳池中游泳

733. 图像渲染

力扣原题 地址

难度与标签

中等难度

  • 广度优先搜索(BFS)
  • 深度优先搜索(DFS)

题目描述

有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。

给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。

为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。

最后返回经过上色渲染后的图像。

示例 1:

输入: 
image = [[1,1,1],[1,1,0],[1,0,1]]
sr = 1, sc = 1, newColor = 2
输出: [[2,2,2],[2,2,0],[2,0,1]]
解析: 
在图像的正中间,(坐标(sr,sc)=(1,1)),
在路径上所有符合条件的像素点的颜色都被更改成2。
注意,右下角的像素没有更改为2,
因为它不是在上下左右四个方向上与初始点相连的像素点。

注意:

  • imageimage[0] 的长度在范围 [1, 50] 内。
  • 给出的初始点将满足 0 <= sr < image.length0 <= sc < image[0].length
  • image[i][j]newColor 表示的颜色值在范围 [0, 65535] 内。

题目分析

首先理解这个用例输入输出:

对于输入的二维数组:

111
110
101

其中开始位置为 (1,1) 新的颜色为 2

所以整张图的遍历就从表中的 1 开始,并且需要从这个点上下左右进行遍历,如果满足特定条件,就进行 “渲染”:遍历到的点与初始点的颜色相同,即代表颜色的值相同。

输出结果为:

222
220
201

例2 为了确保自己已经理解了题目意思,不妨修改输入然后提交查看输出。

151
110
301

其中开始位置为 (1,1) 新的颜色为 2

输出结果为:

251
220
301

因为 35 不满足 渲染 条件,而 右边的两个 1 又因为隔离不能被 渲染.

在理解题意以后就方便写代码了,广度优先遍历与深度优先遍历都能解决问题,并且难易程度近似。这里直接摘录 官方解答 ,注意是考虑到代码简洁规范。

解题代码1——广度优先遍历(BFS)

class Solution {
public:// 成对出现,表示上下左右方向const int dx[4] = {1, 0, 0, -1};const int dy[4] = {0, 1, -1, 0};vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {// 当前的颜色;int currColor = image[sr][sc];// 如果已染色if (currColor == newColor) return image;int n = image.size(), m = image[0].size();// 注意队列的数据类型是 pair queue<pair<int, int>> que;que.emplace(sr, sc);image[sr][sc] = newColor;while (!que.empty()) {int x = que.front().first, y = que.front().second;que.pop();// 四个方向遍历for (int i = 0; i < 4; i++) {int mx = x + dx[i], my = y + dy[i];// 边界判定if (mx >= 0 && mx < n && my >= 0 && my < m && image[mx][my] == currColor) {que.emplace(mx, my);image[mx][my] = newColor;}}}return image;}
};

复杂度分析

  • 时间复杂度: O ( n × m ) O(n\times m) O(n×m) ,其中 n n n m m m 分别是二维数组的行数和列数。最坏情况下需要遍历所有的方格一次。
  • 空间复杂度: O ( n × m ) O(n\times m) O(n×m) ,其中 n n n m m m 分别是二维数组的行数和列数。主要为队列的开销。

解题代码2——深度优先遍历(DFS)

DFS 用到了递归,但是总体思路也比较简单,一定要重点关注递归的终止条件。

class Solution {
public:const int dx[4] = {1, 0, 0, -1};const int dy[4] = {0, 1, -1, 0};void dfs(vector<vector<int>>& image, int x, int y, int color, int newColor) {// 如果颜色等于初始颜色就可以渲染// 并且四个方向进行检测,渲染if (image[x][y] == color) {image[x][y] = newColor;for (int i = 0; i < 4; i++) {int mx = x + dx[i], my = y + dy[i];// 边界判断if (mx >= 0 && mx < image.size() && my >= 0 && my < image[0].size()) {dfs(image, mx, my, color, newColor);}}}}vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {int currColor = image[sr][sc];if (currColor != newColor) {dfs(image, sr, sc, currColor, newColor);}return image;}
};

复杂度分析

  • 时间复杂度: O ( n × m ) O(n\times m) O(n×m) ,其中 n n n m m m 分别是二维数组的行数和列数。最坏情况下需要遍历所有的方格一次。
  • 空间复杂度: O ( n × m ) O(n\times m) O(n×m) ,其中 n n n m m m 分别是二维数组的行数和列数。主要为队列的开销。

复习一下 BFS 和 DFS

以下内容摘录自《数据结构(C 语言版)》电子档

在这里插入图片描述

BFS

广度优先搜索(Breadth First Search, BFS)遍历类似于树的 按层次遍历 的过程。

广度优先搜索遍历的过程如下。

(1) 从图中某个顶点 v v v 出发,访问 v v v

(2) 依次访问 v v v 的各个未曾访问过的邻接点。

(3) 分别从这些邻接点出发依次访问它们的邻接点, 并使 “先被访问的顶点的邻接点“ 先于 ”后被访问的顶点的邻接点” 被访问。重复步骤(3), 直至图中所有已被访问的顶点的邻接点都被访间到。

DFS

DFS (DepthFirst Search) 遍历类似于树的 先序遍历,是树的先序遍历的推广。

对于一个连通图,深度优先搜索遍历的过程如下。

(1) 从图中某个顶点 v v v 出发, 访问 v v v

(2) 找出刚访问过的顶点的第一个未被访问的邻接点, 访问该顶点。 以该顶点为新顶点,重复此步骤, 直至刚访问过的顶点没有未被访问的邻接点为止。

(3) 返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的邻接点, 访问该顶点。

(4) 重复步骤 (2) 和 (3), 直至图中所有顶点都被访问过,搜索结束。

总结

刷这道题的主要目标是通过简单的题回顾一下 DFS 和 BFS 的基本思想以及如何结合实际应用(比如说遍历的时候的条件等)。相对于前面两道题这个应该更简单,更方便以最快的速度回顾一下以前的知识。

Smileyan
2021.8.15 23:16

这篇关于【图论刷题-3】力扣 733. 图像渲染的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600195

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,