Skip to main content

腐烂的橘子

题目

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

  • 0 代表空单元格;
  • 1 代表新鲜橘子;
  • 2 代表腐烂的橘子.

每分钟, 腐烂的橘子周围 4 个方向上相邻的新鲜橘子都会腐烂.

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

提示:
  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10
  • grid[i][j] 仅为 0, 12
示例

994-oranges-rotting

输入: grid = [[2,1,1],[1,1,0],[0,1,1]]
输出: 4
输入: grid = [[2,1,1],[0,1,1],[1,0,1]]
输出: -1
解释: 左下角的橘子(第 2 行, 第 0 列)永远不会腐烂, 因为腐烂只会发生在 4 个方向上.
输入: grid = [[0,2]]
输出: 0
解释: 因为 0 分钟时已经没有新鲜橘子了, 所以答案就是 0.

题解

/**
* @param {number[][]} grid
* @return {number}
*/
var orangesRotting = function (grid) {
const m = grid.length
const n = grid[0].length
const queue = []
let freshCount = 0
let time = 0

for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (grid[i][j] === 2) {
queue.push([i, j])
} else if (grid[i][j] === 1) {
freshCount++
}
}
}

const directions = [
[0, 1],
[0, -1],
[1, 0],
[-1, 0],
] // 上下左右四个方向

while (queue.length > 0 && freshCount > 0) {
const size = queue.length
for (let i = 0; i < size; i++) {
const [row, col] = queue.shift()

for (const [dr, dc] of directions) {
const nr = row + dr
const nc = col + dc

if (nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] === 1) {
grid[nr][nc] = 2 // 腐烂
queue.push([nr, nc])
freshCount--
}
}
}
time++ // 时间加 1 分钟
}

return freshCount === 0 ? time : -1
}