这个题应该考虑从终点开始,和前一个问题的不同在于要把不能通过的障碍考虑进去。
在障碍位置的可走路径数应该为0
d p [ i ] [ j ] dp[i][j] dp[i][j]表示从坐标 ( i , j ) (i,j) (i,j)到终点的可走路径数
从终点开始往回填表,遇到障碍则障碍位置的可走路径数就是0。如果当前位置不是障碍,则当前位置
(
i
,
j
)
(i,j)
(i,j)的可走路径数为:
d
p
[
i
]
[
j
]
=
d
p
[
i
+
1
]
[
j
]
+
d
p
[
i
]
[
j
+
1
]
dp[i][j] = dp[i+1][j] + dp[i][j+1]
dp[i][j]=dp[i+1][j]+dp[i][j+1]
这里需要注意防止越界,因为
i
+
1
i+1
i+1和
j
+
1
j+1
j+1的值可能会大于当前二维表的维度,如果大于的话则说明往右或者往下走会越界,这时应该不加这一步。
具体代码如下:
import numpy as np
class Solution(object):
def uniquePathsWithObstacles(self, obstacleGrid):
"""
:type obstacleGrid: List[List[int]]
:rtype: int
"""
if len(obstacleGrid) == 0:
return 0
m = len(obstacleGrid)
n = len(obstacleGrid[0])
dp = np.zeros((m, n))
dp[m-1][n-1] = 1 # 初始化
for i in range(m-1, -1, -1):
for j in range(n-1, -1, -1):
if obstacleGrid[i][j] == 1: # 如果当前位置是障碍,则往后的可走路径肯定是0
dp[i][j] = 0
else: # 如果不是障碍,则考虑加上往右走的路径数和往下走的路径数,这里要注意防止越界
# 加上往右走的
if j+1 <= n-1:
dp[i][j] += dp[i][j+1]
if i+1 <= m-1:
dp[i][j] += dp[i+1][j]
return int(dp[0][0])
solution = Solution()
print(solution.uniquePathsWithObstacles([
[0,0,0],
[0,1,0],
[0,0,0]
]))