腐烂的橘子
题目
在给定的 m x n
网格 grid
中, 每个单元格可以有以下三个值之一:
- 值
0
代表空单元格; - 值
1
代表新鲜橘子; - 值
2
代表腐烂的橘子.
每分钟, 腐烂的橘子周围 4 个方向上相邻的新鲜橘子都会腐烂.
返回*直到单元格中没有新鲜橘子为止所必须经过的最小分钟数. 如果不可能, 返回 -1*.
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 10
grid[i][j]
仅为0
,1
或2
示例
输入: 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
}