LeetCode 算法入门 — 腐烂的橘子

707 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

腐烂的橘子

原题地址

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

  • 值 0 代表空单元格;
  • 值 1 代表新鲜橘子;
  • 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。

示例 1:

输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4

示例 2:

输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。

示例 3:

输入:grid = [[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0

思路分析

  1. 首先记录橘子的总数 total,以及最初始的坏橘子所在的位置数组 badArr
  2. 坏橘子数组长度大于0来循环坏橘子的数组,首先需要处理橘子总数 total -= badArr.length;处理坏橘子周边上下左右的橘子,把每一轮处理的坏橘子位置存储到 temp 中,然后更新 badArr,并且增加轮数 result,继续循环,直到 badArr 为空,证明可以处理的橘子没有了;
  3. 最后判断 total 的长度,若还有未处理的橘子,就返回 -1;否则,返回 result

AC 代码

/**
 * @param {number[][]} grid
 * @return {number}
 */
var orangesRotting = function(grid) {
    const m = grid.length
    const n = grid[0].length
    let total = 0
    let result = 0
    let badArr = new Array()
    for(let i = 0; i < m; i++){
        for(let j = 0; j < n; j++){
            if(grid[i][j] > 0){
                total++
                if(grid[i][j] === 2) badArr.push([i, j])
            }
        }
    }
    while(badArr.length > 0){
        const temp = new Array()
        total -= badArr.length
        badArr.forEach(item => {
            // 上
            if(item[0] >= 0 && item[1] + 1 >= 0 && item[0] < m && item[1] + 1 < n && grid[item[0]][item[1] + 1] === 1){
                grid[item[0]][item[1] + 1] = 2
                temp.push([item[0], item[1] + 1])
            }
            // 右
            if(item[0] + 1 >= 0 && item[1] >= 0 && item[0] + 1 < m && item[1] < n && grid[item[0] + 1][item[1]] === 1){
                grid[item[0] + 1][item[1]] = 2
                temp.push([item[0] + 1, item[1]])
            }
            // 下
            if(item[0] >= 0 && item[1] - 1 >= 0 && item[0] < m && item[1] - 1 < n && grid[item[0]][item[1] - 1] === 1){
                grid[item[0]][item[1] - 1] = 2
                temp.push([item[0], item[1] - 1])
            }
            // 左
            if(item[0] - 1 >= 0 && item[1] >= 0 && item[0] - 1 < m && item[1] < n && grid[item[0] - 1][item[1]] === 1){
                grid[item[0] - 1][item[1]] = 2
                temp.push([item[0] - 1, item[1]])
            }
        })
        badArr = temp
        if(badArr.length > 0)
            result++
    }
    return total === 0 ? result : -1
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了89.01%的用户
  • 内存消耗:43.6 MB, 在所有 JavaScript 提交中击败了42.32%的用户
  • 通过测试用例:306 / 306

END