有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 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, 因为它不是在上下左右四个方向上与初始点相连的像素点。
注意:
image
和image[0]
的长度在范围[1, 50]
内。- 给出的初始点将满足
0 <= sr < image.length
和0 <= sc < image[0].length
。 image[i][j]
和newColor
表示的颜色值在范围[0, 65535]
内。
/* 算法思想: 这道题给了我们一个用二维数组表示的图像,不同的数字代表不同的颜色,给了我们一个起始点坐标,还有一个新的颜色,让我们把起始点的颜色以及其相邻的同样的颜色都换成新的颜色。那么实际上就是一个找相同区间的题,我们可以用BFS或者DFS来做。先来看BFS的解法,我们使用一个队列queue来辅助,首先将给定点放入队列中,然后进行while循环,条件是queue不为空,然后进行类似层序遍历的方法,取出队首元素,将其赋值为新的颜色,然后遍历周围四个点,如果不越界,且周围的颜色跟起始颜色相同的话,将位置加入队列中。 */ //算法实现: /* class Solution { public: vector> floodFill(vector */ /* 算法思想: DFS的写法相对简洁一些,首先判断如果给定位置的颜色跟新的颜色相同的话,直接返回,否则就对给定位置调用递归函数。在递归函数中,如果越界或者当前颜色跟起始颜色不同,直接返回。否则就给当前位置赋上新的颜色,然后对周围四个点继续调用递归函数。 */ //算法实现: class Solution { public: vector>& image, int sr, int sc, int newColor) { int m = image.size(), n = image[0].size(), color = image[sr][sc]; vector > res = image; vector > dirs{{0,-1},{-1,0},{0,1},{1,0}}; queue > q{{{sr, sc}}}; while (!q.empty()) { int len = q.size(); for (int i = 0; i < len; ++i) { auto t = q.front(); q.pop(); res[t.first][t.second] = newColor; for (auto dir : dirs) { int x = t.first + dir[0], y = t.second + dir[1]; if (x < 0 || x >= m || y < 0 || y >= n || res[x][y] != color) continue; q.push({x, y}); } } } return res; } }; int>> floodFill(vector int>>& image, int sr, int sc, int newColor) { if (image[sr][sc] == newColor) return image; helper(image, sr, sc, image[sr][sc], newColor); return image; } void helper(vector int>>& image, int i, int j, int color, int newColor) { int m = image.size(), n = image[0].size(); if (i < 0 || i >= m || j < 0 || j >= n || image[i][j] != color) return; image[i][j] = newColor; helper(image, i + 1, j, color, newColor); helper(image, i, j + 1, color, newColor); helper(image, i - 1, j, color, newColor); helper(image, i, j - 1, color, newColor); } };