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

每天进步一点点

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

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

相关推荐
坚持编程的菜鸟8 小时前
模拟实现memmove
c语言·算法·模拟实现memmove
wabs6669 小时前
关于图论【最短路径之Dijkstra算法(堆优化版)|卡码网47.参加科学大会的思考】
数据结构·算法·图论·优先级队列·邻接表·小顶堆·卡码网
坚持编程的菜鸟9 小时前
编写判断大小端程序
c语言·算法·判断大小端
papaofdoudou9 小时前
判断排列逆序奇偶性的乘积判别法(范德蒙德符号法)
人工智能·算法
linux-hzh10 小时前
百日算法修炼 · Day 03
java·算法
问商十三载10 小时前
RAG 检索效果差怎么排查?2026 五层诊断法完整指南
开发语言·人工智能·windows·python·算法
嵌入式老牛11 小时前
三相电气量采集模块设计(三)非同步采样时的精度提升
算法·精度·计量
今天AI了吗12 小时前
精细化落地教程:TimechoAI调参标准+数据清洗规范+误差归因+阈值适配全维度指南
大数据·人工智能·算法
zephyr0513 小时前
从递归到迭代:二叉树非递归前中后序遍历详解
算法
evans在进步13 小时前
LeetCode 2 两数相加:链表模拟加法,Java 图解进位过程
java·leetcode·链表