LeetCode刷题(python版)——Topic63. 不同路径 II

一、题设

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

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

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

网格中的障碍物和空位置分别用 <span>1</span><span>0</span>来表示。

示例 1:

LeetCode刷题(python版)——Topic63. 不同路径 II
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

LeetCode刷题(python版)——Topic63. 不同路径 II
输入:obstacleGrid = [[0,1],[0,0]]
输出:1

二、基本思路

最base的想法就是在Topic62不同路径上做一点改进,即在有障碍的时候,该点的dp[i][j] = 0,因为有了障碍,那么到达该点的路径全部作废。那么状态转移方程如下:

LeetCode刷题(python版)——Topic63. 不同路径 II

即在之前的代码上修改:

  1. 无障碍时执行状态转移方程:
 for i in range(1,m):
     for j in range(1,n):
         if obstacleGrid[i][j] == 0:
         # step2:确定状态转移方程
             dp[i][j] = dp[i-1][j] + dp[i][j-1]

2.在初始化时在有障碍物的地方赋0:

起初我是这样写的:

for i in range(m):
    if obstacleGrid[i][0] == 0:
        dp[i][0] = 1
for i in range(n):
    if obstacleGrid[0][i] == 0:
        dp[0][i] = 1

这样写的问题就是前后并没有影响,而是有障碍的时候为1,无障碍地时候为0,那么这样写的逻辑其实是错误的,其实当第一行或者第一列 出现了一个障碍以后,那么之后的那一行或者那一列已经是走不通了,也应该是0.所以我们应该找到一个0,之后就是0了。如下:

step3:初始化:遇到有障碍物的后面或下面都是0了
        i = 0
        while i

三、代码实现

 def uniquePathsWithObstacles(self, obstacleGrid):
        m,n = len(obstacleGrid),len(obstacleGrid[0])
        # step1:dp[i][j]表示到(i,j)坐标有多少种走法
        dp = [[0 for _ in range(n)]for _ in range(m)]
        # step3:初始化:遇到有障碍物的后面或下面都是0了
        i = 0
        while i

四、效率总结

LeetCode刷题(python版)——Topic63. 不同路径 II

Original: https://blog.csdn.net/weixin_54039182/article/details/127824207
Author: 计科第一深情
Title: LeetCode刷题(python版)——Topic63. 不同路径 II

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/660169/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球