题解
62.不同路径CSDN或LeetCode
和62不同的是,本题边界上的路径数受障碍物的影响且网格处存在障碍物,则到达此处的路径数为0。
因此,只需在边界路径数上和更新路径时做些改变就可满足本题要求。
动态规划
- 特判:
- 若 o b s t a c l e G r i d obstacleGrid obstacleGrid为空,返回 0 0 0
- 若左上角或者右下角任意一个位置存在障碍物则返回 0 0 0,即 o b s t a c l e G r i d [ 0 ] [ 0 ] = = 1 o r o b s t a c l e G r i d [ − 1 ] [ − 1 ] = = 1 obstacleGrid[0][0]==1 or obstacleGrid[-1][-1]==1 obstacleGrid[0][0]==1orobstacleGrid[−1][−1]==1
- 初始化数组行数 m m m和列数 n n n。初始化动态数组 d p dp dp, d p dp dp为 m ∗ n m*n m∗n维数组,所有位置初始化为 0 0 0, d p [ 0 ] [ 0 ] = 1 dp[0][0]=1 dp[0][0]=1表示起点的路径总数(因为特判去除了起点不可达的情况,所以一定可达)
- 初始化第一行的边界路径,遍历区间 [ 1 , n ) [1,n) [1,n):若满足条件 o b s t a c l e G r i d [ 0 ] [ i ] ! = 1 obstacleGrid[0][i]!=1 obstacleGrid[0][i]!=1,表示当前位置没有障碍物, d p [ 0 ] [ i ] dp[0][i] dp[0][i]等于上一位置的路径数 d p [ 0 ] [ i − 1 ] dp[0][i-1] dp[0][i−1]。若不满足,则保持为 0 0 0
- 初始化第一列的边界路径,遍历区间 [ 1 , m ) [1,m) [1,m):若满足条件 o b s t a c l e G r i d [ j ] [ 0 ] ! = 1 obstacleGrid[j][0]!=1 obstacleGrid[j][0]!=1,表示当前位置没有障碍物, d p [ j ] [ 0 ] dp[j][0] dp[j][0]等于上一位置的路径数 d p [ j − 1 ] [ 0 ] dp[j-1][0] dp[j−1][0]。若不满足,则保持为 0 0 0
- 和62题一样,遍历每一行,遍历区间
[
1
,
m
)
[1,m)
[1,m):
- 遍历每一列,遍历区间
[
1
,
n
)
[1,n)
[1,n):
- 若网格 ( x , y ) (x,y) (x,y)处没有障碍物,即 o b s t a c l e G r i d [ x ] [ y ] ! = 1 obstacleGrid[x][y]!=1 obstacleGrid[x][y]!=1,则网格 ( x , y ) (x,y) (x,y)处的路径数等于网格 ( x − 1 , y ) (x-1,y) (x−1,y)和网格 ( x , y − 1 ) (x,y-1) (x,y−1)处的路径之和,即 d p [ x ] [ y ] = d p [ x − 1 ] [ y ] + d p [ x ] [ y − 1 ] dp[x][y]=dp[x-1][y]+dp[x][y-1] dp[x][y]=dp[x−1][y]+dp[x][y−1]。
- 遍历每一列,遍历区间
[
1
,
n
)
[1,n)
[1,n):
- 返回右下角的路径数, d p [ − 1 ] [ − 1 ] dp[-1][-1] dp[−1][−1]。
复杂度分析
- 时间复杂度: O ( M ∗ N ) O(M*N) O(M∗N)
- 空间复杂度: O ( M ∗ N ) O(M*N) O(M∗N),借助 d p dp dp数组保存结果
Python
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
if(not obstacleGrid):
return 0
if(obstacleGrid[0][0]==1 or obstacleGrid[-1][-1]==1):
return 0
m=len(obstacleGrid)
n=len(obstacleGrid[0])
dp=[[0]*n for _ in range(m)]
dp[0][0]=1
for i in range(1,n):
if(obstacleGrid[0][i]!=1):
dp[0][i]=dp[0][i-1]
for j in range(1,m):
if(obstacleGrid[j][0]!=1):
dp[j][0]=dp[j-1][0]
for x in range(1,m):
for y in range(1,n):
if(obstacleGrid[x][y]!=1):
dp[x][y]=dp[x-1][y]+dp[x][y-1]
return dp[-1][-1]