1. 题目描述
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 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]内。
2. 解题思路
这道题的主要思路就是对数组进行遍历,将符合条件的节点染色,有两种方式:深度优先遍历和广度优先遍历。
(1)BFS(广度优先遍历):
从起始像素向上下左右扩散,只要相邻的点存在并和起始点颜色相同,就染成新的颜色,并继续扩散。
设置一个队列去遍历节点,满足条件的节点入列,并将队列的第一个节点出列,将其染成新的颜色。已经染成新色的节点不会入列,避免重复访问节点。
该方式的时间复杂度:O(n),空间复杂度:O(n)
(2)DFS(深度优先遍历):
从目标像素开始执行染色,并会对上下左右四个像素递归地进行染色。
当前遍历的点超出了边界,或者它不是起始点的颜色,就直接返回。同样的,对于已经染成新色的节点不会递归dfs。
2. 代码实现
BFS:
/**
* @param {number[][]} image
* @param {number} sr
* @param {number} sc
* @param {number} newColor
* @return {number[][]}
*/
var floodFill = function(image, sr, sc, newColor) {
const m = image.length
const n = image[0].length
const oldColor = image[sr][sc]
if(oldColor === newColor) return image
const queue = [[sr,sc]]
while(queue.length){
const [i, j] = queue.shift()
image[i][j] = newColor
if(i-1 >= 0 && image[i-1][j] === oldColor) queue.push([i-1, j])
if(i+1 < m && image[i+1][j] === oldColor) queue.push([i+1, j])
if(j-1 >= 0 && image[i][j-1] === oldColor) queue.push([i, j-1])
if(j+1 < n && image[i][j+1] === oldColor) queue.push([i, j+1])
}
return image
};
DFS:
/**
* @param {number[][]} image
* @param {number} sr
* @param {number} sc
* @param {number} newColor
* @return {number[][]}
*/
const floodFill = (image, sr, sc, newColor) => {
const m = image.length;
const n = image[0].length;
const oldColor = image[sr][sc];
if (oldColor === newColor) return image;
const fill = (i, j) => {
if (i < 0 || i >= m || j < 0 || j >= n || image[i][j] !== oldColor) {
return;
}
image[i][j] = newColor;
fill(i - 1, j);
fill(i + 1, j);
fill(i, j - 1);
fill(i, j + 1);
};
fill(sr, sc);
return image;
};
4. 提交结果
BFS:
DFS: