LeetCode刷题:733. Flood Fill
原题链接:https://leetcode.com/problems/flood-fill/
An image is represented by a 2-D array of integers, each integer representing the pixel value of the image (from 0 to 65535).
Given a coordinate (sr, sc) representing the starting pixel (row and column) of the flood fill, and a pixel value newColor, "flood fill" the image.
To perform a "flood fill", consider the starting pixel, plus any pixels connected 4-directionally to the starting pixel of the same color as the starting pixel, plus any pixels connected 4-directionally to those pixels (also with the same color as the starting pixel), and so on. Replace the color of all of the aforementioned pixels with the newColor.
At the end, return the modified image.
Example 1:
Input:
image = [[1,1,1],[1,1,0],[1,0,1]]
sr = 1, sc = 1, newColor = 2
Output: [[2,2,2],[2,2,0],[2,0,1]]
Explanation:
From the center of the image (with position (sr, sc) = (1, 1)), all pixels connected
by a path of the same color as the starting pixel are colored with the new color.
Note the bottom corner is not colored 2, because it is not 4-directionally connected
to the starting pixel.
Note:
The length of image and image[0] will be in the range [1, 50].
The given starting pixel will satisfy 0 <= sr < image.length and 0 <= sc < image[0].length.
The value of each color in image[i][j] and newColor will be an integer in [0, 65535].
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 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]
内。DFS算法
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
深度优先遍历的主要思想就是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问。
沿着某条路径遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。
算法设计
package com.bean.algorithm.dfsbfs;
public class FloodFillDemo {
/*
* 采用DFS算法进行四个方向的搜索处理
* 当 image[sr][sc]的所有位置都置位newColor时,结束处理。
* */
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
//设定条件,如果当 image[sr][sc] == newColor时,就返回新的 image
if (image[sr][sc] == newColor) return image;
//调用DFS算法进行处理
fillDFS(image, sr, sc, image[sr][sc], newColor);
return image;
}
/*
* DFS算法设计
* 按照sr和sc,color,newColor的设置开始进行四个方向的遍历处理
* */
private void fillDFS(int[][] image, int sr, int sc, int color, int newColor) {
//处理异常数据
if (sr < 0 || sr >= image.length || sc < 0 || sc >= image[0].length || image[sr][sc] != color) return;
//设置新的值
image[sr][sc] = newColor;
//递归调用
fillDFS(image, sr + 1, sc, color, newColor); // 向下
fillDFS(image, sr - 1, sc, color, newColor); // 向上
fillDFS(image, sr, sc + 1, color, newColor); // 向右
fillDFS(image, sr, sc - 1, color, newColor); // 向左
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] image = {
{1,1,1},
{1,1,0},
{1,0,1}
};
int sr=1;
int sc=1;
int newColor=2;
FloodFillDemo floodFillDemo=new FloodFillDemo();
int [][] result = floodFillDemo.floodFill(image, sr, sc, newColor);
// 输出: [[2,2,2],[2,2,0],[2,0,1]]
for(int i=0;i
程序运行结果
2 2 2
2 2 0
2 0 1