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

LeetCode?启动!!!


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

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

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

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

题目描述

代码与解题思路

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

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 变量的计数判断:

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

每天进步一点点

可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。

相关推荐

  1. LeetCode 每日 ---- 【994. 腐烂橘子

    2024-05-13 16:20:02       32 阅读
  2. 每日道算法 994. 腐烂橘子

    2024-05-13 16:20:02       27 阅读
  3. 腐烂橘子 -- DFS、BFS

    2024-05-13 16:20:02       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-13 16:20:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-13 16:20:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-13 16:20:02       87 阅读
  4. Python语言-面向对象

    2024-05-13 16:20:02       96 阅读

热门阅读

  1. Redis简述

    2024-05-13 16:20:02       28 阅读
  2. linux下sd卡的备份与还原

    2024-05-13 16:20:02       31 阅读
  3. 动态NAT

    动态NAT

    2024-05-13 16:20:02      33 阅读
  4. 猜数字(c++语言)

    2024-05-13 16:20:02       31 阅读
  5. 为什么数据库字符编码不一致会导致索引失效

    2024-05-13 16:20:02       32 阅读
  6. 【Git LFS】Git管理大文件

    2024-05-13 16:20:02       33 阅读
  7. lustre文件系统详细介绍

    2024-05-13 16:20:02       31 阅读