[JavaScript 刷题] 搜索 - 腐烂的橘子, leetcode 994
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 搜索 - 腐烂的橘子, leetcode 994相关的知识,希望对你有一定的参考价值。
[javascript 刷题] 搜索 - 腐烂的橘子, leetcode 994
唉……之前写过笔记总结的问题,还是又卡住了。
自挂东南枝……
题目地址:
题目如下:
You are given an m x n
grid
where each cell can have one of three values:
0
representing an empty cell,1
representing a fresh orange, or2
representing a rotten orange.
Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.
Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1
.
解题思路
快被自己蠢哭了,在 leetcode 279 里面的时候写过了:
这里的
size
必须要声明一个变量去进行保存,否则 queue 的长度会在第三个循环中不断地变化,从而导致第二个循环无法结束,返回错误的答案。
还是因为这个问题卡了好久……
以后不能偷懒,还是得多定义一些变量,尤其是可能会产生变动的值,例如说数组长度之类的……
除此之外还有一个问题就在于,开局同时有多个 rotton orange:
这时候橘子会同时从 grid[0][0]
与 grid[2][2]
开始烂起,而不是先烂完一边,再烂另一边。
如果忽略了这个条件,那么可能至少一半的 test cases 都无法通过。
这样的话,就需要在进行 BFS 之前就扫描一次数组,将所有烂橘子都丢到 queue 里面,遍历同一层级的结点时,counter+1。伪代码大致如下:
while rottonOranges:
counter++;
for rottronOrange in rottonOranges:
bfs()
就是这个 for
循环的终结条件又把我卡上了……
使用 JavaScript 解题
重要的事情说三遍,const size = rottonOranges.length;
这个条件是必须的,JavaScript 中必须要重新声明一个变量去保存 size
。
const directions = [
[1, 0],
[-1, 0],
[0, 1],
[0, -1],
];
const findOranges = (grid) =>
let freshOranges = 0,
rottonOranges = [];
for (let i = 0; i < grid.length; i++)
for (let j = 0; j < grid[i].length; j++)
if (grid[i][j] === 1) freshOranges++;
else if (grid[i][j] === 2) rottonOranges.push([i, j]);
return [freshOranges, rottonOranges];
;
/**
* @param number[][] grid
* @return number
*/
var orangesRotting = function (grid)
if (!grid || !grid[0]) return -1;
let [freshOrange, rottonOranges] = findOranges(grid);
if (freshOrange === 0) return 0;
let minutes = 0;
while (rottonOranges.length && freshOrange > 0)
minutes++;
const size = rottonOranges.length;
for (let i = 0; i < size; i++)
const [currRow, currCol] = rottonOranges.shift();
for (const [rowAdded, colAdded] of directions)
const updatedRow = currRow + rowAdded,
updatedCol = currCol + colAdded;
if (grid[updatedRow] && grid[updatedRow][updatedCol] === 1)
grid[updatedRow][updatedCol] = 2;
rottonOranges.push([updatedRow, updatedCol]);
freshOrange--;
if (freshOrange > 0) return -1;
return minutes;
;
以上是关于[JavaScript 刷题] 搜索 - 腐烂的橘子, leetcode 994的主要内容,如果未能解决你的问题,请参考以下文章
[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79
[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79
Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges)
[JavaScript 刷题] 二分搜索 - 搜索二维矩阵, leetcode 74