zoukankan      html  css  js  c++  java
  • LeetCode733 图像渲染

    有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 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]内。

    /*
    算法思想:
        这道题给了我们一个用二维数组表示的图像,不同的数字代表不同的颜色,给了我们一个起始点坐标,还有一个新的颜色,让我们把起始点的颜色以及其相邻的同样的颜色都换成新的颜色。那么实际上就是一个找相同区间的题,我们可以用BFS或者DFS来做。先来看BFS的解法,我们使用一个队列queue来辅助,首先将给定点放入队列中,然后进行while循环,条件是queue不为空,然后进行类似层序遍历的方法,取出队首元素,将其赋值为新的颜色,然后遍历周围四个点,如果不越界,且周围的颜色跟起始颜色相同的话,将位置加入队列中。
    */
    //算法实现:
    /*
    class Solution {
    public:
        vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
            int m = image.size(), n = image[0].size(), color = image[sr][sc];
            vector<vector<int>> res = image;
            vector<vector<int>> dirs{{0,-1},{-1,0},{0,1},{1,0}};
            queue<pair<int, int>> q{{{sr, sc}}};
            while (!q.empty()) {
                int len = q.size();
                for (int i = 0; i < len; ++i) {
                    auto t = q.front(); q.pop();
                    res[t.first][t.second] = newColor;
                    for (auto dir : dirs) {
                        int x = t.first + dir[0], y = t.second + dir[1];
                        if (x < 0 || x >= m || y < 0 || y >= n || res[x][y] != color) continue;
                        q.push({x, y});
                    }
                }
            }
            return res;
        }
    };
    */
    /*
    算法思想:
        DFS的写法相对简洁一些,首先判断如果给定位置的颜色跟新的颜色相同的话,直接返回,否则就对给定位置调用递归函数。在递归函数中,如果越界或者当前颜色跟起始颜色不同,直接返回。否则就给当前位置赋上新的颜色,然后对周围四个点继续调用递归函数。
    */
    //算法实现:
    class Solution {
    public:
        vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
            if (image[sr][sc] == newColor) return image;
            helper(image, sr, sc, image[sr][sc], newColor);
            return image;
        }
        void helper(vector<vector<int>>& image, int i, int j, int color, int newColor) {
            int m = image.size(), n = image[0].size();
            if (i < 0 || i >= m || j < 0 || j >= n || image[i][j] != color) return;
            image[i][j] = newColor;
            helper(image, i + 1, j, color, newColor);
            helper(image, i, j + 1, color, newColor);
            helper(image, i - 1, j, color, newColor);
            helper(image, i, j - 1, color, newColor);
        }
    };
  • 相关阅读:
    Eclipse中的快捷键
    xml文件头文件生成策略以及导入约束条件
    HTTP协议状态代码和错误状态含义的解释
    水了一个前端面试 记下问的东西
    整理的一些PHP面试题目
    Magic Index 寻找数组中A[i]=i的位置(原题转自微信号待字闺中)
    【经典算法】寻找最长01字串(转自待字闺中)
    PHP中不用第三个变量交换两个变量的值
    已知一个数组a[N]来构造数组b[N]的有趣算法题
    MySQL安装后默认自带数据库的作用
  • 原文地址:https://www.cnblogs.com/parzulpan/p/10061638.html
Copyright © 2011-2022 走看看