LeetCode-64.最小路径和

题目描述

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

说明:每次只能向下或者向右移动一步。
在这里插入图片描述

思路

设dp为大小为 m x n的矩阵,dp[i][j]代表直到走到(i,j)这个点的最小路径和
题目要求,只能向右或向下走,换句话说,当前单元格 (i,j) 只能从左方单元格 (i-1,j)(i−1,j) 或上方单元格 (i,j-1)走到,因此只需要考虑矩阵左边界和上边界。
那么, 走到当前单元格 (i,j)的最小路径和 == “从左方单元格 (i,j-1) 与 从上方单元格 (i-1,j) 走来的 两个最小路径和中较小的 ” + 当前单元格值 grid[i][j] 。具体分为以下 4 种情况:

  1. 当左边和上边都不是边界,即i≠0, j≠0, dp[i][j]=min(dp[i][j-1], dp[i-1][j])
  2. 当左边是边界, 也就是只能从上边走过来, dp[i][j]=dp[i-1][j]
  3. 当右边是边界,也就是只能从左边走过来, dp[i][j]=dp[i][j-1]
  4. 当左、上都是边界,即当i=j=0,也就是起点, dp[i][j]=grid[i][j]

空间优化:
其实我们完全不需要建立 dpdp 矩阵浪费额外空间,直接遍历 grid[i][j]修改即可。这是因为:grid[i][j] = min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j] ;原 grid矩阵元素中被覆盖为 dp 元素后(都处于当前遍历点的左上方),不会再被使用到。

代码实现(py3)

class Solution:
    def minPathSum(self, grid: [[int]]) -> int:
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                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]

复杂度分析
1.时间复杂度 O(M×N) : 遍历整个 grid矩阵元素。
2.空间复杂度 O(1) : 直接修改原矩阵,不使用额外空间。

解答参考

作者:jyd
链接:https://leetcode-cn.com/problems/minimum-path-sum/solution/zui-xiao-lu-jing-he-dong-tai-gui-hua-gui-fan-liu-c/
来源:力扣(LeetCode)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值