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

每天进步一点点

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

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

相关推荐
2501_924747111 小时前
驾驶场景玩手机识别准确率↑32%:陌讯动态特征融合算法实战解析
人工智能·算法·计算机视觉·智能手机
limitless_peter2 小时前
优先队列,链表优化
c++·算法·链表
屁股割了还要学4 小时前
【数据结构入门】栈和队列
c语言·开发语言·数据结构·学习·算法·青少年编程
Monkey的自我迭代4 小时前
支持向量机(SVM)算法依赖的数学知识详解
算法·机器学习·支持向量机
阿彬爱学习5 小时前
AI 大模型企业级应用落地挑战与解决方案
人工智能·算法·微信·chatgpt·开源
L.fountain5 小时前
配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
算法·配送
啊阿狸不会拉杆8 小时前
《算法导论》第 13 章 - 红黑树
数据结构·c++·算法·排序算法
qiuyunoqy8 小时前
蓝桥杯算法之搜索章 - 3
c++·算法·蓝桥杯·深度优先·dfs·剪枝
lifallen9 小时前
Kafka ISR机制和Raft区别:副本数优化的秘密
java·大数据·数据库·分布式·算法·kafka·apache
m0_6265352010 小时前
贪心算法学习 3 买卖股票的最佳时机 i ii
学习·算法·贪心算法