LeetCode算法刷题——广度优先搜索/深度优先搜索

本文详细介绍了LeetCode中的广度优先搜索(BFS)和深度优先搜索(DFS)算法,并通过实例解析了这两种算法在图像渲染、岛屿最大面积、合并二叉树等题目的应用。此外,还探讨了BFS和DFS在解决01矩阵、腐烂的橘子问题上的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


今天和大家一起学习广度优先搜索/深度优先搜索。作为一个小白,我认为积极与实验室师兄讨论是一个好习惯,师兄告诉我除去动态规划以外,广度优先搜索/深度优先搜索算是算法题中复杂度稍高的题目之一,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值