有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。
为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。
最后返回经过上色渲染后的图像。
思路解析参考
class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
if(sr >= image.length || sc >= image[0].length || sr < 0 || sc < 0) {
return image;
}
dfs(image, sr, sc, image[sr][sc], newColor);
return image;
}
public void dfs(int[][] image, int sr, int sc, int oldColor, int newColor) {
if(sr < 0 || sc < 0 || sr >= image.length || sc >= image[0].length || image[sr][sc] == newColor || image[sr][sc] != oldColor) {
return;
}
image[sr][sc] = newColor;
dfs(image, sr - 1, sc, oldColor, newColor);
dfs(image, sr + 1, sc, oldColor, newColor);
dfs(image, sr, sc - 1, oldColor, newColor);
dfs(image, sr, sc + 1, oldColor, newColor);
}
}
class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
int origColor = image[sr][sc];
fill(image, sr, sc, origColor, newColor);
return image;
}
private void fill(int[][] image, int x, int y, int origColor, int newColor) {
// 出界:超出数组边界
if (!inArea(image, x, y)) {
return;
}
// 碰壁:遇到其他颜色,超出 origColor 区域
if (image[x][y] != origColor) {
return;
}
// 已探索过的 origColor 区域
if (image[x][y] == -1) {
return;
}
// choose:打标记,以免重复
image[x][y] = -1;
fill(image, x, y + 1, origColor, newColor);
fill(image, x, y - 1, origColor, newColor);
fill(image, x - 1, y, origColor, newColor);
fill(image, x + 1, y, origColor, newColor);
// unchoose:将标记替换为 newColor
image[x][y] = newColor;
}
private boolean inArea(int[][] image, int x, int y) {
return x >= 0 && x < image.length && y >= 0 && y < image[0].length;
}
}