题目:

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

An image is represented by a 2-D array of integers, each integer representing the pixel value of the image (from 0 to 65535).

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

Given a coordinate (sr, sc) representing the starting pixel (row and column) of the flood fill, and a pixel value newColor, "flood fill" the image.

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

To perform a "flood fill", consider the starting pixel, plus any pixels connected 4-directionally to the starting pixel of the same color as the starting pixel, plus any pixels connected 4-directionally to those pixels (also with the same color as the starting pixel), and so on. Replace the color of all of the aforementioned pixels with the newColor.

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

At the end, return the modified image.

示例 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]内。

Note:

The length of image and image[0] will be in the range [1, 50].

The given starting pixel will satisfy 0 <= sr < image.length and 0 <= sc < image[0].length.

The value of each color in image[i][j] and newColor will be an integer in [0, 65535].

解题思路:

​ 与01矩阵类似,在图的数据结构内找到所有旧的像素点改成新的新素值。无非是图的遍历,BFS和DFS。

就这道题而言,不涉及路径长度,明显DFS深度优先遍历更适合。因为BFS广度优先遍历需要记录每个相邻符合要求的位置,并且不能添加重复的点。 DFS可以用栈或递归实现,如果用栈来解虽然比递归更好理解一些,但是每次依然要存储每个点的索引位置,并且出入栈也会消耗时间。所以这道题的最优解应该是用递归实现的深度优先遍历解题。

代码:

DFS(Java):

class Solution {
private boolean withinBounds(int[][] img, int i, int j) {//判断指针是否溢出
return (i < img.length && i >= 0) && (j < img[0].length && j >= 0);
} private void floodFillProcess(int[][] img, int sr, int sc, int oc, int nc) {
if (withinBounds(img, sr, sc) && img[sr][sc] == oc) {//指针不溢出且像素值为旧值时
img[sr][sc] = nc;//改为新值
floodFillProcess(img, sr - 1, sc, oc, nc);//递归上下左右四个点
floodFillProcess(img, sr + 1, sc, oc, nc);
floodFillProcess(img, sr, sc - 1, oc, nc);
floodFillProcess(img, sr, sc + 1, oc, nc);
}
} public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
int oc = image[sr][sc];
if (newColor == oc) return image;
floodFillProcess(image, sr, sc, oc, newColor);
return image;
}
}

DFS(Python):

class Solution:
def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
oldColor = image[sr][sc]
if oldColor == newColor:
return image
self.dfs(image, sr, sc, oldColor, newColor)
return image def dfs(self, image: List[List[int]], sr: int, sc: int, oldColor: int, newColor: int):
if image[sr][sc] == oldColor:
image[sr][sc] = newColor
if sr-1 >= 0:#先判断是否溢出再决定是否递归
self.dfs(image, sr-1, sc, oldColor, newColor)
if sr+1 < len(image):
self.dfs(image, sr+1, sc, oldColor, newColor)
if sc-1 >= 0:
self.dfs(image, sr, sc-1, oldColor, newColor)
if sc+1 < len(image[0]):
self.dfs(image, sr, sc+1, oldColor, newColor)

附:

BFS深度优先遍历(Java):

class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
int oldColor = image[sr][sc];
if (oldColor == newColor) return image;//旧像素值与新像素值相等时,无需修改
int rows = image.length;
int columns = image[0].length;
bfs(image, sr * columns + sc, rows, columns, newColor, oldColor);//进入BFS辅助函数
return image;
} private void bfs(int[][] img, int loc, int row, int column, int nc, int oc) {
Set<Integer> set = new LinkedHashSet<>(); //set(),避免添加重复点
Queue<Integer> queue = new LinkedList<>();
queue.add(loc);//队列加入第一个初始点,记录点索引的方式是x*column+y,
while (!queue.isEmpty()) {
int tmp = queue.poll();
int r = tmp / column, c = tmp % column;//拆解位置
if (img[r][c] == oc && !set.contains(tmp)) {//像素值为旧值,并且该点未被计算过
img[r][c] = nc;//改为新值
set.add(tmp);
if (r + 1 < row) if (img[r + 1][c] == oc) queue.add((r + 1) * column + c);
if (r - 1 >= 0) if (img[r - 1][c] == oc) queue.add((r - 1) * column + c);
if (c + 1 < column) if (img[r][c + 1] == oc) queue.add(r * column + c + 1);
if (c - 1 >= 0) if (img[r][c - 1] == oc) queue.add(r * column + c - 1);
}
}
}
}

LeetCode 733: 图像渲染 flood-fill的更多相关文章

  1. Java实现 LeetCode 733 图像渲染(DFS)

    733. 图像渲染 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的 ...

  2. [Swift]LeetCode733. 图像渲染 | Flood Fill

    An image is represented by a 2-D array of integers, each integer representing the pixel value of the ...

  3. Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill)

    Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill) 深度优先搜索的解题详细介绍,点击 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 ...

  4. 【LeetCode】733. Flood Fill 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:BFS 日期 题目地址:ht ...

  5. LN : leetcode 733 Flood Fill

    lc 733 Flood Fill 733 Flood Fill An image is represented by a 2-D array of integers, each integer re ...

  6. [LeetCode&Python] Problem 733. Flood Fill

    An image is represented by a 2-D array of integers, each integer representing the pixel value of the ...

  7. Leetcode733.Flood Fill图像渲染

    有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newCol ...

  8. [LeetCode] Flood Fill 洪水填充

    An image is represented by a 2-D array of integers, each integer representing the pixel value of the ...

  9. 【Leetcode_easy】733. Flood Fill

    problem 733. Flood Fill 题意:图像处理中的泛洪填充算法,常见的有四邻域像素填充法.八邻域像素填充法.基于扫描线的像素填充法,实现方法分为递归与非递归(基于栈). 泛洪填充算法原 ...

随机推荐

  1. IT兄弟连 HTML5教程 HTML5的基本语法 简单HTML实例制作

    现在学习HTML5的方式 目前HTML还处于HTML4与HTML5之间的过渡使用阶段.移动端的Web界面开发已经全面使用HTML5的技术,而在PC端由于用户升级浏览器周期较长,面临着页面的兼容性问题, ...

  2. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 3

    23.2  接口实现的基础 大家都很了解函数在本地应用,通过名称调用函数执行,并通过传递不同参数,函数有不同执行,执行后给调用者返回结果.如果把一个函数做成一个接口远程访问,也需要这几个步骤.使用HT ...

  3. JDBC进阶 元数据

    1:resultSet 1.1最基本的ResultSet. 1.2 可滚动的ResultSet类型 1.3 可更新的ResultSet 1.4 可保持的ResultSet 2:PrepareState ...

  4. 华为mate10 pro内置浏览器出现的令人头疼的样式兼容问题

    问题描述:   下图红色框区域内容在华为mate10 pro(以下简称mate10)内置浏览器中整体向左偏移,没有居中,其它手机浏览器都无该问题,如下图 问题分析   经过一番追根溯源,我发现是 bo ...

  5. hyper-v Centos7 网卡配置无效

    环境: Win 10 Hyper-v 安装虚拟机:Centos 7 遇到问题: 网络配置无效,使用命令“ip addr” 网卡没有出现在列表中,显示了一个奇怪的网卡名字如“enp0s010f”,配置文 ...

  6. sql server pivot

    SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[YearSalary]( [year] [int] NULL, ...

  7. NetCore 下使用 DataTable 以及可视化工具

    DtatTable 在命名空间System.Data下,NetCore2.0及以上支持.但是2017DataTable没有可视化工具,我也没有深研究直接下载的VS2019.然后在网上早了个SQLHel ...

  8. 数据库-用户管理与pymysql

    mysql用户管理 !这是dba的活儿!,但是万一公司没有dba? mysql用户指的是什么? 我们每一次在操作前都需要指定账号和密码,这个账号就是mysql的用户; 为什么要管理? 一个公司不可能只 ...

  9. C#程序员在老项目中用到VB遇到的一次坑

    博主自认为C#基础还不错.但是最近接到一个需求,是用VB写的.万般不愿意,不想接触VB,并不是说VB语言不好,而是我真的不喜欢VB.因为没基础过VB,领导派给的任务,有这个需求,不愿意归不愿意,领导给 ...

  10. CSS符合选择器

    CSS复合选择器 后代选择器 后代选择器又称为包含选择器,可以选择父元素里面的子元素.其写法就是把外层标签写在前面,内层标签写在后面,中间用空格分隔,当标签发生嵌套时,内层标签就成为外层标签的后代 元 ...