当前位置: 首页 > article >正文

leetcode动态规划(六)-不同路径(有障碍物)

题目

63.不同路径(有障碍物)

给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。

网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。

返回机器人能够到达右下角的不同路径数量。

测试用例保证答案小于等于 2 * 109

示例 1:

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

示例 2:

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

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

思路

1.确定dp数组(dp table)以及下标的含义

dp[i][j]表示从坐标[0][0]到坐标[i][j]一共有多少种路径

2.确定递推公式

和无障碍物路径一样,dp[i][j]依赖dp[i-1][j]和dp[i][j-1]

3.dp数组如何初始化

题目已经给了障碍物的情况,在初始化第一行和第一列的时候,需要注意在有障碍物的后面的位置均是无路径的,都需要设置为0,而当obstacleGrid[i][j]中显示为0的时候,就是这里可以通过,那就赋值为1即可

4.确定遍历顺序

由递推公式可知,是需要从前往后来进行遍历的

5.举例推导dp数组

代码

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        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)]
        for i in range(m):
            if obstacleGrid[i][0]==0:
                dp[i][0] = 1
            if obstacleGrid[i][0]==1:
                break

        for j in range(n):
            if obstacleGrid[0][j] == 0:
                dp[0][j] = 1
            if obstacleGrid[0][j] == 1:
                break

        for i in range(1,m):
            for j in range(1,n):
                if obstacleGrid[i][j] == 1:
                    dp[i][j] = 0
                else:
                    dp[i][j] = dp[i-1][j]+dp[i][j-1]
        return dp[-1][-1]

 


http://www.kler.cn/a/355352.html

相关文章:

  • RPA系列-uipath 学习笔记3
  • C语言从入门到放弃教程
  • Centos下的OpenSSH服务器和客户端
  • 查询 MySQL 默认的存储引擎(SELECT @@default_storage_engine;)
  • ROM修改进阶教程------修改刷机包init.rc 自启用户自定义脚本的一些基本操作 代码格式与注意事项
  • 深度学习之超分辨率算法——FRCNN
  • Java学习Day25:基础篇15:反射
  • MuSig2(一种多签名方案,具有签名聚合的特性
  • Python近红外光谱数据分析技术
  • IPv6 DNS简介
  • 一种用于机械手自适应抓取控制的紧凑型指尖形视触觉传感器
  • 【银行科技岗】相关考试知识点总结及部分考题
  • 学习的文档10/14
  • 系统共享库(Shared Library)
  • 重置时把el-tree树节点选中状态取消
  • Flink有状态计算
  • 【Golang】合理运用泛型,简化开发流程
  • ubuntu 使用appimage安装的应用,应该怎么创建桌面的快捷方式
  • 设定一个抽奖系统
  • Java高级Day54-正则表达式底层实现
  • Kerberos4简单复现
  • IP不纯净的后果及解决方案
  • 【JPCS独立出版,EI检索稳定】第三届能源互联网及电力系统国际学术会议(ICEIPS 2024)
  • React Componet类组件详解(老项目)
  • 数据结构编程实践20讲(Python版)—10B+树
  • Nature Communications 英国伦敦大学等提出仿生自适应多平面触觉系统,实现机械与振动双重感知结合