📅  最后修改于: 2023-12-03 15:26:27.021000             🧑  作者: Mango
给定一个二维的 01 矩阵,其中只有 1 和 0,1 表示障碍物,0 表示通路,给定一个起点和一个终点,求从起点到终点的最小步数,需要满足在走的过程中只能走上下左右四个方向,不能斜着走,并且不能穿过障碍物。
我们可以使用广度优先搜索(BFS)算法来解决这个问题,BFS 是解决最短路径问题的经典算法。我们从起点开始,每次向四个方向扩展节点,直到找到终点或者遍历完整个矩阵。
具体实现步骤如下:
from collections import deque
class Solution:
def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
rows, cols = len(grid), len(grid[0])
# 边界判断
if grid[0][0] == 1 or grid[rows - 1][cols - 1] == 1:
return -1
# 初始化队列
queue = deque()
queue.append((0, 0, 1))
visited = set()
visited.add((0, 0))
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 右、下、左、上
while queue:
x, y, step = queue.popleft()
if x == rows - 1 and y == cols - 1:
return step # 到达终点,返回结果
for dx, dy in directions:
new_x, new_y = x + dx, y + dy
if 0 <= new_x < rows and 0 <= new_y < cols and grid[new_x][new_y] == 0 and (new_x, new_y) not in visited:
queue.append((new_x, new_y, step + 1))
visited.add((new_x, new_y))
return -1 # 无法到达终点
时间复杂度:$O(N^2)$,其中 $N$ 是二维数组中的元素个数。
空间复杂度:$O(N)$。在 BFS 算法中,最多同时存在 $N$ 个节点需要加入队列,并且每个节点只访问一次,因此记录每个节点是否访问过的 visited 数组所需的空间也是 $O(N)$ 级别的。