《Leetcode》63. 不同路径 II

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

 

示例 1:

输入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

1、题目分析

这个题目求得是从左上角到右下角有多少条路可以走,这种题显而易见得就是是用动态规划算法。如果从左上角到右下角就有两条路:先右后下,先下后右。所有可以构造一个动态规划方程:dp[i][j]=dp[i][j-1]+dp[i-1][j]。如果(i,j)是障碍物得话那么dp[i][j]=0.如果入口都是障碍物或者给定得数组为空直接就返回0.

2、解题分析

题目用的是动态规划,接下来就分析做题步骤。

  • 计算给迷宫的长(m)和宽(n)
  • 初始化一个dp二维矩阵大小为m*n
  • 初始化dp[0][0]=1,然后在初始化第一行和第一列
  • 遍历给定矩阵的m-1行和n-1列
    • 如果(i,j)==0,那么动态转移方程就是dp[i][j]=dp[i][j-1]+dp[i-1][j]
    • 否则转移方程就是dp[i][j]=0
  • 返回结果dp[-1][-1]

3、代码

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m, n = len(obstacleGrid), len(obstacleGrid[0])
        #如果入口为1或者给定矩阵为0直接返回0
        if obstacleGrid[0][0] == 1 or not obstacleGrid:
            return 0
        #初始化一个状态矩阵
        dp = [[0]*n for _ in range(m)]
        #将入口初始化为1
        dp[0][0] = 1
        #如果行或者列的值为0,那就将上个dp值赋给它.
        #这样就保证在障碍物之前的我们都可以初始化成1了
        for i in range(1, m):
            if obstacleGrid[i][0] == 0:
                dp[i][0] = dp[i-1][0]
        for j in range(1, n):
            if obstacleGrid[0][j] == 0:
                dp[0][j] = dp[0][j-1]

        for i in range(1, m):
            for j in range(1, n):
                #如果不是障碍物就进行状态转移
                if obstacleGrid[i][j] == 0:
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
                    
        return dp[m - 1][n - 1]

总结:对于最短路径的我们一般使用BFS,对于有多少不同路径的都使用动态转移方程,当然这个题还可以把空间复杂度再进行压缩,使用一维数组记录动态变化。还有可以优化的空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值