本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
题目链接:LeetCode 733. 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]内。
二、思路分析
从原点出发,如果当下点是旧颜色,就改成新颜色,并对于周围旧颜色的点『如此』。
用BFS和DFS都行。
如何表达『访问四周』?
思路1:直接写。对于上下左右,分别判断是否越界、是否为旧颜色等,类似的代码写(复制)4份。
思路2:上下左右的坐标相当于当前位置偏差分别是[0,1],[0,-1],[1,0],[-1,0],可以作为一个数组,再遍历这个数组。在每轮遍历中,当前位置加上偏差得到新的位置,判断是否越界、是否为旧颜色的逻辑写一次就可以了。
时间复杂度分析
每一个旧颜色的点都要访问,且只访问一次。最极限的情况下,所有点都是旧颜色的点,这时候全部都要访问。因此时间复杂度是O(n2)。
三、AC 代码
Python BFS
def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
def bfs(image:List[List[int]], sr:int, sc:int, newColor:int):
oldColor = image[sr][sc]
if newColor == oldColor:
return
queue = deque()
queue.append((sr,sc))
while len(queue) != 0:
sr, sc = queue.popleft()
image[sr][sc] = newColor
arr = [[-1,0],[1,0],[0,-1],[0,1]]
for x,y in arr:
row = sr+x
col = sc+y
if row < 0 or row >= len(image) or col < 0 or col >= len(image[0]):
continue
if image[row][col] != oldColor:
continue
queue.append((row,col))
bfs(image,sr,sc,newColor)
return image
四、总结
常常遇到需要访问四周或者往四周的其中一个方向行走,且对于每一个方向处理思路都相同的情况,其实都可以把四周的偏差存入数组,再进行遍历。这样写可以少很多冗余的代码。 类似的需要访问四周的情景还有很多,比如下棋、表格行走等。
如果你觉的还不错的话,给我点个赞吧💐