1091. Shortest Path in Binary Matrix

Given a matrix of 0s and 1s, we’re asked to start from grid[0][0] and make our way to grid[n-1][n-1] with the shortest path possible. This can be done using breadth-first search. We use the grid to keep track of the distance we’ve seen so far, which also helps us mark a location as seen.

The solution is as follows:

class Solution:
    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
        if grid[0][0] != 0 or grid[-1][-1] != 0:
            return -1
 
        n = len(grid)
        directions = [
            (-1, -1),
            (-1, 0),
            (-1, 1),
            (0, -1),
            (0, 1),
            (1, -1),
            (1, 0),
            (1, 1),
        ]
 
        def get_neighbours(row: int, col: int) -> tuple:
            for i_diff, j_diff in directions:
                i, j = row + i_diff, col + j_diff
                if -1 < i < n and -1 < j < n and grid[i][j] == 0:
                    yield (i, j)
 
        queue = []
        queue.append((0, 0))
        grid[0][0] = 1
 
        while queue:
            curr_queue, queue = queue, []
 
            for row, col in curr_queue:
                distance = grid[row][col]
 
                if (row, col) == (n - 1, n - 1):
                    return distance
 
                for i, j in get_neighbours(row, col):
                    grid[i][j] = distance + 1
                    queue.append((i, j))
 
        return -1

_ Time Complexity:

O(m) - We iterate through the edges to perform union_set.

_ Space Complexity:

O(n) - We track the parents and ranks of each node.