链接:leetcode.cn/problems/fl…
有一幅以 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]]
解题
我们使用队列,将给定的第一个坐标存入,然后遍历这个队列,将其中的坐标取出,判断其上下左右的像素颜色是否为原始颜色。如果符合条件,就将其坐标存入队列中,直到队列为空。
其实广度搜索的模板很固定,如果题目是考广度搜索,直接套就行。
代码
class Solution {
/*次数定义的这个dx,dy是方便待会遍历x,y坐标的“上下左右”位置
当i = 0时,dx[0] = 0,dy[0] = 1,直接加到x,y坐标上就是“右”,以此类推
*/
int[] dx = {0, 0, 1, -1};
int[] dy = {1, -1, 0, 0};
public int[][] floodFill(int[][] image, int sr, int sc, int color) {
//创建数组类型的队列数组中只存两个数字,0下标为x轴,1下标为y轴
Queue<int[]> queue = new LinkedList<>();
//判断一下第一个像素颜色是否需要修改,如果不需要就直接返回
if (image[sr][sc] == color) {
return image;
}
//共有 m 行
int m = image.length;
//共有 n 列
int n = image[0].length;
//定义需要修改的颜色,方便下面进行判断
int oldColor = image[sr][sc];
//先将第一个题目给定的坐标存到队列中
queue.add(new int[]{sr, sc});
//遍历队列直到为空
while (!queue.isEmpty()) {
//取出队头中的坐标
int[] coordinate = queue.poll();
int x = coordinate[0];
int y = coordinate[1];
//更换颜色
image[x][y] = color;
//判断x,y坐标的上下左右像素是否符合条件
for (int i = 0; i < 4; i++) {
//定义坐标
int temx = x + dx[i];
int temy = y + dy[i];
//判断是否符合条件,注意此时的temx和temy为边界的时候
if (temx < m && temx >= 0 && temy < n && temy >= 0 && image[temx][temy] == oldColor) {
//符合条件的存到队列中,进行遍历更改
queue.add(new int[]{temx,temy});
}
}
}
//wile循环走完后,返回结果
return image;
}
}