这个题解首先判断右下角是否有障碍,如果有,则直接返回空路径。若没有障碍,从右下角开始,逆向考虑每个位置是否可以到达。使用标记值2代表可以向下走到达终点,标记值3代表可以向右走到达终点。这个标记过程是一个逆向的动态规划过程。开始于右下角,向左上角逆推,每个格子根据其右侧和下方的格子的标记来确定自己的标记。最后,如果左上角的格子被标记为可行(标记值大于1),则构造路径。路径的构造是根据每个格子的标记决定下一步是向下还是向右移动。
时间复杂度: O(r*c)
空间复杂度: O(r*c)
class Solution:
def pathWithObstacles(self, obstacleGrid: List[List[int]]) -> List[List[int]]:
ans, r, c = [], len(obstacleGrid), len(obstacleGrid[0])
# 如果终点有障碍物, 直接返回空路径
if obstacleGrid[-1][-1] != 0:
return ans
# 标记终点可达
obstacleGrid[-1][-1] = 2
# 从右下角向左上角标记可达路径
for i in range(r-1, -1, -1):
for j in range(c-1, -1, -1):
if obstacleGrid[i][j] > 1:
if i > 0 and not obstacleGrid[i - 1][j]:
obstacleGrid[i - 1][j] = 2
if j > 0 and not obstacleGrid[i][j - 1]:
obstacleGrid[i][j - 1] = 3
# 如果起点可达, 构造路径
if obstacleGrid[0][0] > 1:
i, j = 0, 0
while i < r and j < c:
ans.append([i, j])
if obstacleGrid[i][j] == 2:
i += 1
else:
j += 1
return ans