9. Shortest path - BFS
1091. Shortest Path in Binary Matrix
Medium
5.6K
200
Companies
Given an n x n
binary matrix grid
, return the length of the shortest clear path in the matrix. If there is no clear path, return -1
.
A clear path in a binary matrix is a path from the top-left cell (i.e., (0, 0)
) to the bottom-right cell (i.e., (n - 1, n - 1)
) such that:
All the visited cells of the path are
0
.All the adjacent cells of the path are 8-directionally connected (i.e., they are different and they share an edge or a corner).
The length of a clear path is the number of visited cells of this path.
Example 1:
!https://assets.leetcode.com/uploads/2021/02/18/example1_1.png
Input: grid = [[0,1],[1,0]]
Output: 2
Example 2:
!https://assets.leetcode.com/uploads/2021/02/18/example2_1.png
Input: grid = [[0,0,0],[1,1,0],[1,1,0]]
Output: 4
Example 3:
Input: grid = [[1,0,0],[1,1,0],[1,1,0]]
Output: -1
Constraints:
n == grid.length
n == grid[i].length
1 <= n <= 100
grid[i][j] is 0 or 1
Shortest Path in Binary Matrix - LeetCode
Time complexity: (MN)
Space complexity: O(MN)
/**
* @param {number[][]} grid
* @return {number}
*/
var shortestPathBinaryMatrix = function (grid) {
const visited = new Array(grid.length);
for (let i = 0; i < grid.length; i++) {
visited[i] = new Array(grid[0].length).fill(0);
}
const q = [[1, 0, 0]];
visited[0][0] = true;
// const sets = [];
while (q.length !== 0) {
// console.log(q);
const [step, row, col] = q.shift();
if (grid[row][col] === 1)
break;
// console.log(row, col);
if (row === grid.length - 1 && col === grid[0].length - 1) {
// sets.push([step]);
return step;
}
const nextNodes = findNextNodesToVisit(grid, row, col, visited, step);
q.push(...nextNodes);
}
return -1;
// console.log(sets);
// return sets.length === 0 ? -1 : Math.max(...sets);
};
const directions = [
[-1, -1], [0, -1], [1, -1],
[-1, 0], [0, 0], [1, 0],
[-1, 1], [0, 1], [1, 1]
]
function findNextNodesToVisit(m, row, col, visited, step) {
const nextNodes = [];
for (const [x, y] of directions) {
const nextRow = row + x;
const nextCol = col + y;
if (!isValidNode(m, nextRow, nextCol)) continue;
if (visited[nextRow][nextCol]) continue;
visited[nextRow][nextCol] = true;
if (m[nextRow][nextCol] === 1) continue;
nextNodes.push([step + 1, nextRow, nextCol]);
}
return nextNodes;
}
function isValidNode(m, row, col) {
return 0 <= row && row < m.length && 0 <= col && col < m[0].length;
}
Last updated