博客
关于我
LeetCode之动态规划2之不同路径(62)、不同路径II(63)、最小路径和(64)
阅读量:338 次
发布时间:2019-03-04

本文共 2813 字,大约阅读时间需要 9 分钟。

矩阵路径

问题描述

一个机器人位于一个 m x n 网格的左上角,起始点标记为“Start”。机器人每次只能向下或者向右移动一步,目标是到达网格的右下角“Finish”。问总共有多少条不同的路径?

示例:输入:m = 3, n = 7,输出:28。

思路分析

  • 问题分析

    机器人每次只能向下或向右移动一步,因此到达网格右下角的路径数可以通过组合数学计算。具体来说,机器人需要向右移动 n-1 次,向下移动 m-1 次,总路径数为组合数 C(m+n-2, m-1) 或 C(m+n-2, n-1)。

  • 动态规划方法

    定义状态 dp[i][j] 为从左上角到 (i, j) 的不同路径数。状态转移方程为 dp[i][j] = dp[i-1][j] + dp[i][j-1],边界条件为 dp[0][j] = 1 和 dp[i][0] = 1。

  • 优化方法

    使用状态压缩,仅需记录当前行和上一行的值,空间复杂度降至 O(n)。

  • 解决代码

    class Solution:    def uniquePaths(self, m: int, n: int) -> int:        if m == 0 or n == 0:            return 0        dp = [[0] * n for _ in range(m)]        for i in range(m):            dp[i][0] = 1        for j in range(n):            dp[0][j] = 1        for i in range(1, m):            for j in range(1, n):                dp[i][j] = dp[i-1][j] + dp[i][j-1]        return dp[-1][-1]

    时间复杂度

    • 时间复杂度:O(mn)
    • 空间复杂度:O(mn)

    不同路径II

    问题描述

    一个机器人位于一个 m x n 网格的左上角,起始点标记为“Start”。网格中有障碍物,障碍物和空位置分别用 1 和 0 表示。问从左上角到右下角的不同路径数?

    示例:障碍物Grid = [[0,0,0],[0,1,0],[0,0,0]],输出:2。

    思路分析

  • 动态规划方法

    定义 dp[i][j] 为从 (0, 0) 到 (i, j) 的不同路径数。状态转移方程为 dp[i][j] = dp[i-1][j] + dp[i][j-1],但如果当前格子为障碍物,则路径数为 0。

  • 初始条件

    dp[0][j] = 1 和 dp[i][0] = 1,前提是对应的格子不是障碍物。

  • 优化方法

    可以记录上一行和当前行的值,空间复杂度为 O(n)。

  • 解决代码

    class Solution:    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:        if not obstacleGrid or not obstacleGrid[0]:            return 0        m = len(obstacleGrid)        n = len(obstacleGrid[0])        dp = [[0] * n for _ in range(m)]        for i in range(m):            dp[i][0] = 1 if obstacleGrid[i][0] == 0 else 0        for j in range(n):            dp[0][j] = 1 if obstacleGrid[0][j] == 0 else 0        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]

    时间复杂度

    • 时间复杂度:O(mn)
    • 空间复杂度:O(mn)

    最小路径和

    问题描述

    给定一个包含非负整数的 m x n 网格 grid,从左上角到右下角的路径使得路径上的数字总和最小。

    示例:grid = [[1,3,1],[1,5,1],[4,2,1]],输出:7。

    思路分析

  • 动态规划方法

    定义 dp[i][j] 为从左上角到 (i, j) 的最小路径和。状态转移方程为 dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])。

  • 初始条件

    dp[0][j] = dp[0][j-1] + grid[0][j],dp[i][0] = dp[i-1][0] + grid[i][0]。

  • 优化方法

    可以直接修改原矩阵,空间复杂度为 O(1)。

  • 解决代码

    class Solution:    def minPathSum(self, grid: List[List[int]]) -> int:        if not grid or not grid[0]:            return 0        rows = len(grid)        cols = len(grid[0])        for i in range(rows):            for j in range(cols):                if i == j == 0:                    continue                elif i == 0:                    grid[i][j] = grid[i][j-1] + grid[i][j]                elif j == 0:                    grid[i][j] = grid[i-1][j] + grid[i][j]                else:                    grid[i][j] = min(grid[i-1][j], grid[i][j-1]) + grid[i][j]        return grid[-1][-1]

    时间复杂度

    • 时间复杂度:O(mn)
    • 空间复杂度:O(1)

    转载地址:http://qugh.baihongyu.com/

    你可能感兴趣的文章
    mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
    查看>>
    MySQL Cluster 7.0.36 发布
    查看>>
    Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
    查看>>
    MySQL Cluster与MGR集群实战
    查看>>
    multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
    查看>>
    mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
    查看>>
    Multiple websites on single instance of IIS
    查看>>
    mysql CONCAT()函数拼接有NULL
    查看>>
    multiprocessing.Manager 嵌套共享对象不适用于队列
    查看>>
    multiprocessing.pool.map 和带有两个参数的函数
    查看>>
    MYSQL CONCAT函数
    查看>>
    multiprocessing.Pool:map_async 和 imap 有什么区别?
    查看>>
    MySQL Connector/Net 句柄泄露
    查看>>
    multiprocessor(中)
    查看>>
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
    查看>>
    mysql csv import meets charset
    查看>>
    multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
    查看>>