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 。
思路分析
- 首先记录橘子的总数
total,以及最初始的坏橘子所在的位置数组badArr; - 坏橘子数组长度大于0来循环坏橘子的数组,首先需要处理橘子总数
total -= badArr.length;处理坏橘子周边上下左右的橘子,把每一轮处理的坏橘子位置存储到temp中,然后更新badArr,并且增加轮数result,继续循环,直到badArr为空,证明可以处理的橘子没有了; - 最后判断
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