【LeetCode】每日一题 2024_5_13 腐烂的橘子(经典多源 BFS)

文章目录

LeetCode?启动!!!

好久没写每日一题题解了,今天重新起航

干一件事情,永远不会太迟,只要现在开始,做什么都不算晚

题目:找出不同元素数目差数组

题目链接:994. 腐烂的橘子

题目描述

代码与解题思路

思路如标题,这道题是一道经典的多源 BFS 题目

go 复制代码
func orangesRotting(grid [][]int) int {
    var dx = []int{0, 1, -1, 0}
    var dy = []int{1, 0, 0, -1}
    n, m := len(grid), len(grid[0])
    q := [][]int{}
    // 把第一轮需要 bfs 的节点找出
    for i := range grid {
        for j, v := range grid[i] {
            if v == 2 {
                q = append(q, []int{i, j})
            }
        }
    }
    ans := 0
    for len(q) > 0 {
        // 进行一轮 bfs
        for sz := len(q); sz > 0; sz-- {
            t := q[0]
            q = q[1:]
            for i := 0; i < 4; i++ {
                x, y := dx[i]+t[0], dy[i]+t[1]
                if x < 0 || x >= n || y < 0 || y >= m || grid[x][y] != 1 {
                    continue
                }
                grid[x][y] = 2
                q = append(q, []int{x, y})
            }
        }
        if len(q) > 0 {
            ans++
        }
    }
    // 如果还有新鲜的橘子, 则返回 -1
    for i := range grid {
        for _, v := range grid[i] {
            if v == 1 {
                return -1
            }
        }
    }
    return ans
} 

这是经典的多源 bfs 解题模板,我的解法,不过,最后再遍历一次判断是否还有新鲜橘子的操作可能略有些丑陋

可以看看灵神的判断方式,通过 fresh 变量的计数判断:

go 复制代码
type pair struct{ x, y int }
var directions = []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} // 四方向

func orangesRotting(grid [][]int) int {
    m, n := len(grid), len(grid[0])
    fresh := 0
    q := []pair{}
    for i, row := range grid {
        for j, x := range row {
            if x == 1 {
                fresh++ // 统计新鲜橘子个数
            } else if x == 2 {
                q = append(q, pair{i, j}) // 一开始就腐烂的橘子
            }
        }
    }

    ans := -1
    for len(q) > 0 {
        ans++ // 经过一分钟
        tmp := q
        q = []pair{}
        for _, p := range tmp { // 已经腐烂的橘子
            for _, d := range directions { // 四方向
                i, j := p.x+d.x, p.y+d.y
                if 0 <= i && i < m && 0 <= j && j < n && grid[i][j] == 1 { // 新鲜橘子
                    fresh--
                    grid[i][j] = 2 // 变成腐烂橘子
                    q = append(q, pair{i, j})
                }
            }
        }
    }

    if fresh > 0 {
        return -1
    }
    return max(ans, 0)
}

每天进步一点点

可以和我刷一辈子的每日一题吗?

一题一题,积累起来就是一辈子。

相关推荐
饮水桶_T1 小时前
JAVA IO流笔记
开发语言·数据结构·算法
星夜离尘562 小时前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi2 小时前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
地平线开发者3 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
csdn_aspnet3 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞4 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
青少儿编程课堂5 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
Oneshot7 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
文丑颜不良啊8 小时前
LeetCode2541~2560题目解析
java·leetcode
青少儿编程课堂8 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛