题目描述
这是“不同路径” 的进阶问题:
现在考虑网格中有障碍物。那样将会有多少条不同的路径从左上角到右下角?
网格中的障碍物和空位置分别用 1
和 0
来表示。
例如,
如下所示在 3x3 的网格中有一个障碍物。
[
[0,0,0],
[0,1,0],
[0,0,0]
]
一共有 2
条不同的路径从左上角到右下角。
注意: m 和 n 的值均不超过 100。有障碍物的位置,过来的路径数为0(真坑,原题这里没说)。
我的解法——DP(AC)
- 每个格子可能从上面、左面走下来:dp[i]/[j] = dp[i - 1]/[j] + dp[i]/[j - 1]
- 注意:就是第0行和第0列。如果没有障碍物,所有路径都是1,但是如果有障碍物。从第一个有障碍物开始,这一排和这一列以后的所有路径是0,就是以后的地方都到不了。。
- 注意:dp数组初始要设置为0,不是-1了
- 复杂度O(n2)
- 结果:Beat22.24%
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid):
"""
:type obstacleGrid: List[List[int]]
:rtype: int
"""
m = len(obstacleGrid)
n = len(obstacleGrid[0]) if(len(obstacleGrid) != 0) else 0
dp = [[0 for j in range(n)] for i in range(m)] # 注意:初始要设置为0,不是-1了
if(obstacleGrid[0][0] == 0):
dp[0][0] = 1
for i in range(m):
for j in range(n):
if(obstacleGrid[i][j] == 0):
dp[i][j] += dp[i - 1][j] if(i - 1 >= 0 and obstacleGrid[i - 1][j] == 0) else 0
dp[i][j] += dp[i][j - 1] if(j - 1 >= 0 and obstacleGrid[i][j - 1] == 0) else 0
return dp[m - 1][n - 1]