这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
题目
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 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)),
在路径上所有符合条件的像素点的颜色都被更改成2。
注意,右下角的像素没有更改为2,
因为它不是在上下左右四个方向上与初始点相连的像素点。
提示
image和image[0]的长度在范围[1, 50]内。- 给出的初始点将满足
0 <= sr < image.length和0 <= sc < image[0].length。 image[i][j]和newColor表示的颜色值在范围[0, 65535]内。
解题思路
深度优先搜索
针对给定的坐标[sr, sc]处的像素,我们需要先对其与新的颜色值newColor进行比较,只有两者不相同,才有替换的意义。
然后,从坐标点[sr, sc]处开始,向四周(上/下/左/右)扩散渲染,直至像素值不等于原[sr, sc]处像素为止。
class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
// 边界判断,如果需替换颜色与新颜色一致则直接返回
if(image[sr][sc] != newColor){
// 颜色不一致,进行深度搜索替换
fill(image, sr, sc, image[sr][sc], newColor);
}
// 返回结果
return image;
}
/**
* 颜色替换
* @param image 图画数组
* @param sr x坐标
* @param sc y坐标
* @param oldColor 需替换颜色
* @param newColor 新的颜色
*/
public void fill(int[][] image, int sr, int sc, int oldColor, int newColor){
// 边界判断
if(sr < 0 || sr == image.length || sc < 0 || sc == image[0].length || image[sr][sc] != oldColor){
return;
}
// 修改颜色
image[sr][sc] = newColor;
// 向左搜索替换
fill(image, sr + 1, sc, oldColor, newColor);
// 向右搜索替换
fill(image, sr, sc + 1, oldColor, newColor);
// 向上搜索替换
fill(image, sr - 1, sc, oldColor, newColor);
// 向下搜索替换
fill(image, sr, sc - 1, oldColor, newColor);
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!