【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)
}

每天进步一点点

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

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

相关推荐
Figo_Cheung8 分钟前
Figo基于结构空间算法假设(SSAH)的生成式大模型优化范式与工程实现边界研究——提出适应AGI架构演化的自适应拓扑感知表征机制
算法·架构·agi
旖旎夜光34 分钟前
LCR 170:交易逆序对的总数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
微尘hjx9 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
小蒋观天下13 小时前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习
WBluuue14 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
圣保罗的大教堂14 小时前
leetcode 3619. 总价值可以被 K 整除的岛屿数目 中等
leetcode
澳鹏Appen15 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
benjormin16 小时前
Java数据结构 二叉搜索树
数据结构·算法
人工智能培训16 小时前
知识图谱:结构化表达实体与关系的知识组织技术
大数据·人工智能·算法·重构·生活·知识图谱