题目链接:https://leetcode-cn.com/problems/flood-fill/
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 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]内。
################################################################
题意还是挺好理解的,就像画图里那个小油漆桶,会把同一个封闭区域的颜色给改变了。
先粘贴我的能通过的丑陋代码:
class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
if(image[sr][sc]==newColor){
return image;
}
int old=image[sr][sc];
image[sr][sc]=newColor;
change(image,sr+1,sc,newColor,old);
change(image,sr-1,sc,newColor,old);
change(image,sr,sc-1,newColor,old);
change(image,sr,sc+1,newColor,old);
return image;
}
public void change(int[][] image, int sr, int sc, int newColor,int old){
if(sr>=0&&sr<image.length&&sc>=0&&sc<image[0].length){
if(image[sr][sc]==old){
image[sr][sc]=newColor;
change(image,sr+1,sc,newColor,old);
change(image,sr-1,sc,newColor,old);
change(image,sr,sc-1,newColor,old);
change(image,sr,sc+1,newColor,old);
}
}
}
}
我的思路是从初始坐标像四周扩散,要满足不超过矩形的边界。
官方答案给出了DFS和BFS的代码。对于深度优先搜索和广度优先搜索,我目前的理解是:
DFS好像是二叉树先序遍历的递归,先一条路往下走,走到头了再回溯走过的节点是否有右孩子。在网上找的博客上说不管是前中后序都是DFS,感觉我对于递归,理解的还不是很好。如果不用递归,可以用栈来实现。就好像树的遍历迭代法也可以用栈。
BFS好像是树的层序遍历,一层一层的输出,可以用队列来实现。
DFS一般解决能否联通问题,BFS解决最短路径问题。
代码留个坑,下次来填!