这是悦乐书的第306次更新,第325篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733)。图像由二维整数数组表示,每个整数表示图像的像素值(从0到65535)。给定表示泛洪填充的起始像素(行和列)的坐标(sr,sc)和像素值newColor,进行“泛洪填充”图像。

要执行“泛洪填充”,请考虑起始像素,以及与起始像素相同颜色的起始像素4向连接的任何像素,以及与这些像素4向相连的任何像素(也使用与起始像素),依此类推。用newColor替换所有上述像素的颜色。最后,返回修改后的图像。例如:

输入: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)),连接所有像素通过与起始像素相同颜色的路径用新颜色着色。



注意:

  • 图像和图像[0]的长度将在[1,50]范围内。

  • 给定的起始像素将满足0 <= sr <image.length和0 <= sc <image [0] .length。

  • image [i] [j]和newColor中每种颜色的值将是[0,65535]中的整数。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

题目的意思是将起始位置的值改为新的值,如果值不相同的话。并且以起始坐标开始,其上下左右四个方向的点,如果像素值和起始坐标的相等,也要改为新的坐标值,以这些四个方向上的点也会继续向他们本身的四个方向延伸,直到不能修改为止。

上述问题的子问题与问题本身的性质一样,都是以本身为中心,向四个方向扩散,因此我们可以借助递归来实现,但是需要注意边界,不要下标越界了。

public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
int oldColor = image[sr][sc];
if (oldColor != newColor) {
help(image, sr, sc, newColor, oldColor);
}
return image;
} public void help(int[][] image, int sr, int sc, int newColor, int oldColor) {
if (image[sr][sc] == oldColor) {
image[sr][sc] = newColor;
// 向上
if (sr-1 >= 0) {
help(image, sr-1, sc, newColor, oldColor);
}
// 向下
if (sr+1 < image.length) {
help(image, sr+1, sc, newColor, oldColor);
}
// 向左
if (sc-1 >= 0) {
help(image, sr, sc-1, newColor, oldColor);
}
// 向右
if (sc+1 < image[0].length) {
help(image, sr, sc+1, newColor, oldColor);
}
}
}

03 第二种解法

我们也可以使用迭代的方式来实现,借助队列。队列中存放的是坐标,以数组形式表现,另外将四个方向用两个坐标数组来表示,x表示行的方向,y表示列的方向。在队列中判断四个方向的数据是否符合要求,不能越界并且要等于原始起点的值,将满足这些条件的坐标存入数组。

public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
int oldColor = image[sr][sc];
if (oldColor == newColor) {
return image;
}
Queue<int[]> queue = new LinkedList<int[]>();
queue.offer(new int[]{sr, sc});
int[] x = {1,-1,0,0};
int[] y = {0,0,1,-1};
while (!queue.isEmpty()) {
int size = queue.size();
for (int i=0; i<size; i++) {
int[] temp = queue.poll();
int m = temp[0];
int n = temp[1];
image[m][n] = newColor;
for (int j=0; j<4; j++) {
int nx = x[j]+m;
int ny = y[j]+n;
if (nx>=image.length || nx<0 || ny>=image[0].length || ny<0 || image[nx][ny] != oldColor) {
continue;
}
queue.offer(new int[]{nx, ny});
}
}
}
return image;
}

04 小结

算法专题目前已日更超过五个月,算法题文章174+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Flood Fill(Java实现)的更多相关文章

  1. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  2. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  3. LeetCode刷题 Flood Fill 洪水填充问题

    An  image is represented by a 2-D array of integers,each integers,each integer respresenting the sta ...

  4. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  5. LeetCode算法题-Design HashMap(Java实现)

    这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...

  6. LeetCode算法题-House Robber(Java实现)

    这是悦乐书的第187次更新,第189篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第46题(顺位题号是198).你是一个专业的强盗,计划在街上抢劫房屋. 每个房子都藏着一 ...

  7. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  8. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  9. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

随机推荐

  1. 2.App Inventor 2编程流程

    一.Chrome浏览器打开App Inventor 2编程网站注册登陆:     可选:          A. http://ai2.appinventor.mit.edu/          网速 ...

  2. 关于mui前端传值,springboot后台接收值的问题

    最近做app,使用mui的ajax给后台传参,后台一直接收不到值,表示很蛋疼.这里通过网上搜索加上个人实践,总结归纳了三种前端传值和后台接收的方式. 第一种: 前端: data: JSON.strin ...

  3. XMPP协议之消息回执解决方案

    苦恼中寻找方法 在开始做即时通信时就知道了消息回执这个概念,目的是解决通讯消息因为各种原因未送达对方而提供的一种保障机制.产生这个问题的原因主要是网络不稳定.服务器或者客户端一些异常导致没有接收到消息 ...

  4. Vue(day7)

    一.环境搭建 下面我们需要为后面要做的Vue项目搭建开发环境. 1.基本的运行环境 该项目使用node& vue在webpack环境下进行开发.首先安装基本的模块文件: npm install ...

  5. springboot~mockMvc和asciidoctor生成基于TDD的API文档

    API文档是前端与后端快速开发,减少沟通成本的必要条件,有一份完善的文档是很必要的,由通过测试来生成文档的好处就是:测试数据有了,测试返回结果有了,而且可以对这些字段进行说明,很清晰,在springb ...

  6. ByteView和Sink

    久违啦米娜桑!!! 最近有点忙,一月有余没有更新了,实在对不起大家!!! 上线后看到不少朋友发的私信,感谢大家的赞许与信任,后面我会尽最大的努力按时更新,不断推出更优质的文章!!! 本来计划最后花1讲 ...

  7. SpringBoot轻松整合ElasticSearch

    完整项目代码地址(https://github.com/fonxian/spring-elasticsearch-example/tree/master/spring-elasticsearch-ex ...

  8. DSAPI 网卡流量监控

    这是一个非常有意思的趣味小功能,统计每个网卡的流量信息. Dim 网卡() As DSAPI.网络.网卡信息 = DSAPI.网络.获取本机所有网卡信息 While True Console.Clea ...

  9. DS控件库 DSLed控件呈现滚动字幕效果

    滚动字幕效果在DSled上可以使用偏移来实现,代码如下 运行效果

  10. javascript小记一则:今天在写VS2005——.NET程序时,写的一个JS图片示例案例

    源码如下,如遇调试问题,可以找我解决: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...