LeetCode算法刷题by Python——广度优先搜索/深度优先搜索
今天和大家一起学习广度优先搜索/深度优先搜索。作为一个小白,我认为积极与实验室师兄讨论是一个好习惯,师兄告诉我除去动态规划以外,广度优先搜索/深度优先搜索算是算法题中复杂度稍高的题目之一,but! 题目的套路相对来说比较固定,只要大家多做几道相关题目、多总结,就肥肠easy啦~
话不多说,开始做题。
一、图像渲染
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 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]]
思路:
这个题目我一开始懵住了,反应了一会才想明白image数组里面是像素值 ((°ー°〃))… 当拿到这个题目的时候,我们就会立刻发现需要对整张图进行遍历,典型的BFS/DFS题目。
广度优先搜索 (BFS)
既然要将一种颜色替换为另一种颜色,我们就需要将之前的颜色 (oldColor) 保存出来,然后拿着图上其他像素点的颜色与之做比对,如果相匹配,则加入队列,并将其颜色替换掉。
class Solution:
def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
oldColor = image[sr][sc]
if oldColor == newColor:
return image
n, m = len(image), len(image[0])
que = collections.deque([(sr, sc)])
image[sr][sc] = newColor
while que:
x, y = que.popleft()
for mx, my in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:
if 0 <= mx < n and 0 <= my < m and image[mx][my] == oldColor:
que.append((mx, my))
image[mx][my] = newColor
return image
tips: collections.deque()函数意在构建一个双向队列,它类似于list的容器,可以快速的在队列头部和尾部添加、删除元素
深度优先搜索 (DFS)
DFS一般写一个函数,通过函数体内部调用,实现循环遍历。
class Solution:
def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
oldColor = image[sr][sc]
n, m = len(image), len(image[0])
def dfs(x: int, y: int):
if image[x][y] == oldColor:
image[x][y] = newColor
for mx, my in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:
if 0 <= mx < n and 0 <= my < m and image[mx][my] == oldColor:
dfs(mx, my)
if oldColor != newColor:
dfs(sr, sc)
return image
二、岛屿最大面积
给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
示例 1:
输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]
输出:6