问题:面试题 08.10. 颜色填充
问题来自leetCode。
编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。
待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的横坐标为 sr 纵坐标为 sc。需要填充的新颜色为 newColor 。
「周围区域」是指颜色相同且在上、下、左、右四个方向上存在相连情况的若干元素。
请用新颜色填充初始坐标点的周围区域,并返回填充后的图像。
分析
首先,需要将该问题转化成一个图的问题。其实还是比较容易想到的。
问题是让我们找到和目标点相连的所有区域,很容易想到图论中的连通图。将整个image看做是一张图,即问题转化成对当前的图寻找包含给定节点的最大连通子图问题. 典型的DFS问题。
Code
class Solution {
public int myColor = 0;
public int newColorr = 0;
public boolean[][] visited;
// 寻找连通图
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
visited = new boolean[image.length][image[0].length];
myColor = image[sr][sc];
newColorr = newColor;
DFS(image,sr,sc);
return image;
}
public void DFS(int[][] image, int sr, int sc) {
// 保证下标正确
if (sc < 0 || sc >= image[0].length) return;
if (sr < 0 || sr >= image.length) return;
// 保证不要重复访问,否则会爆栈
if (visited[sr][sc]) return;
visited[sr][sc] = true;
// 如果颜色不同就不用染色
if (image[sr][sc] != myColor) return;
// 向四周寻找
DFS(image,sr,sc-1);
DFS(image,sr,sc+1);
DFS(image,sr-1,sc);
DFS(image,sr+1,sc);
image[sr][sc] = newColorr;
}
}
结果: