1091. 二进制矩阵中的最短路径
BFS 广度优先遍历
- 在用广度优先搜索的时候,脑海里面有一张如下的图:
- 先把起始点加入到队列当中,最外层的while控制只要队列中有元素就一直循环取队头元素进行扩散
- 第二个for循环(或者简写方法的while循环)主要是控制当前这一层的元素的扩散
- 每次都是取队头元素进行扩散
- 题目当中可以对当前元素的四面八方进行扩散,所以声明了一个directions数组方便循环扩散
/**
* @param {number[][]} grid
* @return {number}
*/
var shortestPathBinaryMatrix = function(grid) {
let depth = 0;
let m = grid.length - 1; // 正方形的边长相等
//边界或者开头都是1的情况是无法到达,因此不满足题目要求
if(grid[0][0]==1||grid[m][m]==1){ return -1;}
// 如果只有一个元素的情况
if(m==0){return 1}
let queue = [[0,0]];
// 走过的路都标记为1 因为在BFS中也只会走为0的路
grid[0][0] = 1;
let directions = [
// 垂直向上
[0,-1],
//垂直向下
[0,1],
//向左
[-1,0],
//向右
[1,0],
//左上
[-1,-1],
//左下
[-1,1],
//右上
[1,-1],
//右下
[1,1]
];
while(queue.length){
depth++;
let size = queue.length;
//可以写成for循环 这样写简单
while(size--){
let [x,y] = queue.shift();
// 走到了终点
if(x==m&&y==m){
return depth;
}
for(let dir of directions){
let curX = x+dir[0], curY = y+dir[1];
// 超出边界或者已经访问过了
if(curX>m||curY>m||curX<0||curY<0||grid[curX][curY]==1){
continue;
}
queue.push([curX,curY]);
grid[curX][curY] = 1;
}
}
}
// 这里应该是-1 而不是depth 因为如果上面走通了就返回了 只有走不通没返回才到这里
return -1;
};
结果
执行结果:通过
执行用时:80 ms, 在所有 JavaScript 提交中击败了99.63%的用户
内存消耗:48.6 MB, 在所有 JavaScript 提交中击败了10.86%的用户
通过测试用例:88 / 88
参考
广度优先搜索的通用套路来解决:思路清晰,注释详细 - 二进制矩阵中的最短路径 - 力扣(LeetCode) (leetcode-cn.com)