题目解析:
与Leecode 62一样的思路,只是有了障碍物之后,这个位置及其之前的路径都为0,也即此路不通。
路径矩阵(obstacleGrid)第一行第一列在没有障碍物的时候同一初始化为1,有障碍物时障碍物位置及其之后的位置为0
边界条件:如果起始位置有障碍物,则起始位置为0
其他位置判断是否存在障碍物,如果存在那该位置的路径为0,否则就是左边位置路径与上边位置路径的和
class Solution(object):
def uniquePathsWithObstacles(self, obstacleGrid):
"""
:type obstacleGrid: List[List[int]]
:rtype: int
"""
m, n = len(obstacleGrid), len(obstacleGrid[0]) # 网格行、列
if m == 1: # 只有1列,若存在障碍物,则路径为0,否则为1
if obstacleGrid[0].count(1) == 0:
return 1
else:
return 0
if n == 1: # 只有1行,若存在障碍物,则路径为0,否则为1
for i in range(m):
if obstacleGrid[i][0] == 1:
return 0
return 1
temp = obstacleGrid[0][0] # 记下起始位置
flag = 0 # 标记第一行是否存在障碍物
for i in range(n):
if obstacleGrid[0][i] == 1: # 若存在,则当前位置与其后的位置的路径都为0, 否则为1
flag = 1
else:
obstacleGrid[0][i] = 1
if flag == 1:
obstacleGrid[0][i] = 0
flag = 0 # 标记第一列是否存在障碍物
obstacleGrid[0][0] = temp
for i in range(m):
if obstacleGrid[i][0] == 1: # 若存在,则当前位置与其后的位置的路径都为0,否则为1
flag = 1
else:
obstacleGrid[i][0] = 1
if flag == 1:
obstacleGrid[i][0] = 0
for i in range(1, m):
for j in range(1, n): # 其他位置的路径:先判断是否存在障碍物,若有,则该位置路径为0,若没有,则该位置路径为左边路径与上边路径的和
if obstacleGrid[i][j] == 0:
obstacleGrid[i][j] = obstacleGrid[i-1][j] + obstacleGrid[i][j-1]
else:
obstacleGrid[i][j] = 0
return obstacleGrid[m-1][n-1] # 返回最终位置的路径
在这里插入代码片