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


    一、题设

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

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

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

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

    示例 1:

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

    示例 2:

    输入:obstacleGrid = [[0,1],[0,0]]
    输出:1
    

    二、基本思路

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

            即在之前的代码上修改:

            1. 无障碍时执行状态转移方程:

    1. for i in range(1,m):
    2. for j in range(1,n):
    3. if obstacleGrid[i][j] == 0:
    4. # step2:确定状态转移方程
    5. dp[i][j] = dp[i-1][j] + dp[i][j-1]

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

              起初我是这样写的:

    1. for i in range(m):
    2. if obstacleGrid[i][0] == 0:
    3. dp[i][0] = 1
    4. for i in range(n):
    5. if obstacleGrid[0][i] == 0:
    6. dp[0][i] = 1

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

    1. # step3:初始化:遇到有障碍物的后面或下面都是0了
    2. i = 0
    3. while iand obstacleGrid[i][0] == 0:
    4. dp[i][0] = 1
    5. i += 1
    6. i = 0
    7. while iand obstacleGrid[0][i] == 0:
    8. dp[0][i] = 1
    9. i += 1

    三、代码实现

    1. def uniquePathsWithObstacles(self, obstacleGrid):
    2. m,n = len(obstacleGrid),len(obstacleGrid[0])
    3. # step1:dp[i][j]表示到(i,j)坐标有多少种走法
    4. dp = [[0 for _ in range(n)]for _ in range(m)]
    5. # step3:初始化:遇到有障碍物的后面或下面都是0了
    6. i = 0
    7. while iand obstacleGrid[i][0] == 0:
    8. dp[i][0] = 1
    9. i += 1
    10. i = 0
    11. while iand obstacleGrid[0][i] == 0:
    12. dp[0][i] = 1
    13. i += 1
    14. #step4:确定遍历顺序
    15. for i in range(1,m):
    16. for j in range(1,n):
    17. if obstacleGrid[i][j] == 0:
    18. # step2:确定状态转移方程
    19. dp[i][j] = dp[i-1][j] + dp[i][j-1]
    20. #step5:打印dp数组检查一下,略。
    21. return dp[-1][-1]

    四、效率总结

     

  • 相关阅读:
    [附源码]SSM计算机毕业设计重庆工程学院教师宿舍管理系统论文JAVA
    2022年的有关语义分割的论文,含CVPR、ECCV、ICLR、AAAI
    python代码优化
    IBM X3650 M4服务器配置 并上线JavaWeb项目
    torch.manual_seed(0)报错RuntimeError: CUDA error: unspecified launch failure
    数组常用的方法介绍及使用及频率度(17个)
    使用HTML制作静态网站 中国传统文化 丝绸之路 (学生网页设计作业源码)
    springboot基于Java的电影院售票与管理系统毕业设计源码011449
    面试官:介绍一下 Redis 三种集群模式
    STL函数模板入门
  • 原文地址:https://blog.csdn.net/weixin_54039182/article/details/127824207