题目描述
英文版描述
An image is represented by an m x n integer grid image where image[i][j] represents the pixel value of the image. You are also given three integers sr, sc, and color. You should perform a flood fill on the image starting from the pixel image[sr][sc]. 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), and so on. Replace the color of all of the aforementioned pixels with color. Return the modified image after performing the flood fill.
英文版地址
https://leetcode.com/problems/flood-fill/
中文版描述
有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[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,因为它不是在上下左右四个方向上与初始点相连的像素点。
示例 2: 输入: image = [[0,0,0],[0,0,0]], sr = 0, sc = 0, newColor = 2 输出: [[2,2,2],[2,2,2]]
提示:
-
m == image.length
-
n == image[i].length
-
1 <= m, n <= 50
-
0 <= image[i][j], newColor < 216
-
0 <= sr < m
-
0 <= sc < n
中文版地址
https://leetcode.cn/problems/flood-fill/
解题思路
从初始像素开始,所以我们需要从(0,0)开始遍历到(sr,sc),给途中遇到的像素点赋值并判断他的下上下左右是否有与他像素值一致的,如果有则同样赋值。
解题方法
俺这版
这题建议时间20分钟,我做了快一个小时,呃,没做出来ಥ_ಥ
官方版
深度优先遍历
class Solution {
int[] dx = {1, 0, 0, -1};
int[] dy = {0, 1, -1, 0};
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
int currColor = image[sr][sc];
if (currColor != newColor) {
dfs(image, sr, sc, currColor, newColor);
}
return image;
}
public void dfs(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.length && my >= 0 && my < image[0].length) {
dfs(image, mx, my, color, newColor);
}
}
}
}
}
总结
看过官方解析,我又尝试自己写下,发现我主要的问题在于不知道如何在一个循环内同时获取当前点的上下左右四个位置,答案中是使用上下左右的相对位移组成的数组来解决这个问题的,学到叻! 而且有一点很值得注意,如下图,上面是我在参考了别人提供的深度优先遍历的解题思路后,又尝试写的,但是结果还是不对,我仔细对比了和官方提供答案的区别,就在于传递的坐标变量是否是新建的
我印象中局部变量命名相同是不会影响结果的,因为每个方法都有自己的方法栈,所以觉得很奇怪,于是我分别调用两种方法并分别对涉及到的变量值进行输出
终于发现了问题(−_−;)
问题就在于递归调用外面这个for循环(╥﹏╥),每次调用递归函数,这个for循环里的代码会执行4次,对原先传入的坐标值进行偏移,但是我写的代码在第一次进入for循环的时候就被改变了(b_d)。。。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135418.html