图像渲染

LeetCode每日一题,733. FloodFill

先看题目描述

大意就是给定一个二维数组表示的图像,初始坐标和一个新的颜色值,将和初始坐标像素值相同的点重新用新的颜色值上色,并将新图像返回

算法和思路

这题和前几天做过的被围绕的区域类似,但比那道题简单,那道题是需要找出所有与边界相连的字母,然后修改;这题只需要找出所有与初始坐标相连且像素值一样的像素点,并修改其颜色值。算法就是用 dfs深度优先搜索,从初始坐标点开始,找出所有与其连通且像素值一样的像素点,然后用新颜色填充,最后把新的二维数组返回即可。需要注意的是,若新颜色与初始坐标的颜色相同,则直接返回原图

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
if (image[sr][sc] == newColor) return image;
dfs(image, sr, sc, newColor, image[sr][sc]);
return image;
}

public void dfs(int[][] image, int i , int j, int newColor,int oldColor) {
if (i < 0 || j < 0 || i >= image.length || j >= image[0].length || image[i][j] != oldColor || image[i][j] == newColor) return;
image[i][j] = newColor;
dfs(image, i - 1, j, newColor, oldColor);
dfs(image, i + 1, j, newColor, oldColor);
dfs(image, i, j - 1, newColor, oldColor);
dfs(image, i, j + 1, newColor, oldColor);
}
}