63. 不同路径II(Unique PathsII)

63. 不同路径II(Unique PathsII)

题解

62.不同路径CSDNLeetCode
和62不同的是,本题边界上的路径数受障碍物的影响且网格处存在障碍物,则到达此处的路径数为0。
因此,只需在边界路径数上和更新路径时做些改变就可满足本题要求。

动态规划

  1. 特判:
    • 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
  2. 初始化数组行数 m m m和列数 n n n。初始化动态数组 d p dp dp d p dp dp m ∗ n m*n mn维数组,所有位置初始化为 0 0 0 d p [ 0 ] [ 0 ] = 1 dp[0][0]=1 dp[0][0]=1表示起点的路径总数(因为特判去除了起点不可达的情况,所以一定可达)
  3. 初始化第一行的边界路径,遍历区间 [ 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][i1]。若不满足,则保持为 0 0 0
  4. 初始化第一列的边界路径,遍历区间 [ 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[j1][0]。若不满足,则保持为 0 0 0
  5. 和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) (x1,y)和网格 ( x , y − 1 ) (x,y-1) (x,y1)处的路径之和,即 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[x1][y]+dp[x][y1]
  6. 返回右下角的路径数, d p [ − 1 ] [ − 1 ] dp[-1][-1] dp[1][1]

复杂度分析

  • 时间复杂度: O ( M ∗ N ) O(M*N) O(MN)
  • 空间复杂度: O ( M ∗ N ) O(M*N) O(MN),借助 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]


Java(待完成)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值