[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