[JavaScript 刷题] 搜索 - 腐烂的橘子, leetcode 994

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 搜索 - 腐烂的橘子, leetcode 994相关的知识,希望对你有一定的参考价值。

[javascript 刷题] 搜索 - 腐烂的橘子, leetcode 994

唉……之前写过笔记总结的问题,还是又卡住了。

自挂东南枝……

题目地址:

Rotting Oranges

题目如下:

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, or
  • 2 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

[JavaScript 刷题] 二分搜索 - 搜索二维矩阵, leetcode 74

[JavaScript 刷题] 搜索 - DFS(深度优先搜索)