[JavaScript 刷题] 搜索 - 计算在网格中从原点到特定点的最短路径长度 Leetcode 1091

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 搜索 - 计算在网格中从原点到特定点的最短路径长度 Leetcode 1091相关的知识,希望对你有一定的参考价值。

[javascript 刷题] 搜索 - 计算在网格中从原点到特定点的最短路径长度, Leetcode 1091

不太熟悉 BFS,所以这道题目做起来还是有一点吃力的,题目地址:1091. Shortest Path in Binary Matrix

解题思路

要想用 BFS 解这道题,就必须知道一个定义:

BFS 保证可以找到等重图中的最短路径,其中等重图也包括无重图。

是的,这道题本质上还是一个无重图,神书 Introduction to Algorithms 中描述了图有三种表现方法:

本题中也可以将 matrix 转化为一个图:

这个树图能够比较清晰地解释为什么 BFS 可以找到无重图/等重图的最短路径——已经访问过的路径会被记录再树地节点中,[0, 2][1, 2] 的两个结点为同一度的结点,因此使用 BFS 方法进行搜索不会出现从 [0, 2] 再回到 [1, 2] 的情况。

了解 BFS 保证可以找到等重图中的最短路径 这一定理后,那么就能通过 BFS 的方式寻找到最短路径了,使用一个 queue 保证先进先出(优先遍历同级结点),最终只要能够到达 [m-1, n-1] 的结点,并且该结点数值为 0 即可。

需要稍加注意的是这道题有几个边界条件:

  • 起点不一定为 0

    即还没开始就结束了

  • 终点不一定为 0

    这个边界条件不需要判断,当 queue 长度为 0 时,最后一行 return 可以搞定这个边界条件。不过为了代码的一致性以及提速,我还是写在了开始

使用 JavaScript 解题

/**
 * @param number[][] grid
 * @return number
 */
var shortestPathBinaryMatrix = function (grid) 
  let maxRow = grid.length - 1;
  let maxCol = grid[maxRow].length - 1;

  if (!grid || grid.length === 0) return -1;

  if (grid[0][0] !== 0 || grid[maxRow][maxCol] !== 0) return -1;

  const queue = [[0, 0, 1]];

  const directions = [
    [0, 1],
    [0, -1],
    [1, 0],
    [-1, 0],
    [1, 1],
    [1, -1],
    [-1, 1],
    [-1, -1],
  ];

  while (queue.length > 0) 
    const [currRow, currCol, path] = queue.shift();
    if (currCol === maxCol && currRow === maxRow) return path;

    for (const [row, col] of directions) 
      const nextRow = currRow + row;
      const nextCol = currCol + col;

      if (
        nextRow >= 0 &&
        nextRow <= maxRow &&
        currCol >= 0 &&
        nextCol <= maxCol &&
        grid[nextRow][nextCol] === 0
      ) 
        queue.push([nextRow, nextCol, path + 1]);
        grid[nextRow][nextCol] = 1;
      
    
  

  return -1;
;
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于[JavaScript 刷题] 搜索 - 计算在网格中从原点到特定点的最短路径长度 Leetcode 1091的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79

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

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

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

[JavaScript 刷题] 搜索 - 省份数量, leetcode 547