【LeetCode】图像渲染(BFS/DFS)
题目:
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。
为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。
最后返回经过上色渲染后的图像。
示例:
输入:
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, 因为它不是在上下左右四个方向上与初始点相连的像素点。
BFS
剪枝去重一层一层的加入到队列中。
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
Queue<Integer> queue = new LinkedList<Integer>();
int size = 0;
int target = image[sr][sc];
image[sr][sc] = newColor;
queue.add(sr*image[sr].length+sc);
while(!queue.isEmpty()) {
size = queue.size();
for(int i=0;i<size;i++) {
int count = queue.poll();
int row = count/image[sr].length;
int col = count%image[sr].length;
int up = row-1;
int down = row+1;
int left = col-1;
int right = col+1;
if(up>=0&&image[up][col]!=newColor&&image[up][col]==target) {
image[up][col] = newColor;
queue.add(up*image[sr].length+col);
}
if(down<image.length&&image[down][col]!=newColor&&image[down][col]==target) {
image[down][col] = newColor;
queue.add(down*image[sr].length+col);
}
if(left>=0&&image[row][left]!=newColor&&image[row][left]==target) {
image[row][left] = newColor;
queue.add(row*image[sr].length+left);
}
if(right<image[sr].length&&image[row][right]!=newColor&&image[row][right]==target) {
image[row][right] = newColor;
queue.add(row*image[sr].length+right);
}
}
}
return image;
}
DFS
使用工具栈完成。
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
Stack<Integer> stack = new Stack<Integer>();
int target = image[sr][sc];
stack.add(sr*image[sr].length+sc);
while(!stack.isEmpty()) {
int num = stack.pop();
int row = num/image[sr].length;
int col = num%image[sr].length;
if(row-1>=0&&image[row-1][col]==target&&image[row-1][col]!=newColor)//上
stack.add((row-1)*image[row-1].length+col);
if(row+1<image.length&&image[row+1][col]==target&&image[row+1][col]!=newColor)//下
stack.add((row+1)*image[row+1].length+col);
if(col-1>=0&&image[row][col-1]==target&&image[row][col-1]!=newColor)
stack.add(row*image[row].length+col-1);//左
if(col+1<image[row].length&&image[row][col+1]==target&&image[row][col+1]!=newColor)
stack.add(row*image[row].length+col+1);//右
image[row][col] = newColor;
}
return image;
}
使用递归完成(系统栈)
设计递归条件与终止条件。
static int target = 0;
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
target = image[sr][sc];
return DFS(image,sr,sc,newColor);
}
public int[][] DFS(int[][] image, int sr, int sc, int newColor){
if(target!=image[sr][sc]||newColor==image[sr][sc]) {
return image;
}
image[sr][sc] = newColor;
if(sr-1>=0)DFS(image,sr-1,sc,newColor); //上
if(sr+1<image.length)DFS(image,sr+1,sc,newColor);//下
if(sc-1>=0)DFS(image,sr,sc-1,newColor); //左
if(sc+1<image[sr].length)DFS(image,sr,sc+1,newColor);//右
return image;
}