广度搜索——图像渲染❗❗❗❗经典面试题❗❗❗❗

321 阅读3分钟

链接:leetcode.cn/problems/fl…

有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。

你也被给予三个整数 sr , scnewColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充

为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor

最后返回 经过上色渲染后的图像

示例 1:

img

 输入: 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;
    }
}