64. 最小路径和

该博客介绍了一种动态规划的解题方法,用于解决在给定的非负整数网格中找到从左上角到右下角的最小路径和。题目要求每次只能向下或向右移动。博主提供了详细的解题思路,包括动态数组的初始化、边界条件的处理以及非边界元素的计算,并给出了Python代码实现。动态规划数组dp[i][j]表示到达(i,j)位置的最小路径和,通过迭代计算得出最终结果。
摘要由CSDN通过智能技术生成

64. 最小路径和

原始题目链接:https://leetcode-cn.com/problems/minimum-path-sum/

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

说明:每次只能向下或者向右移动一步。

在这里插入图片描述

解题思路:

典型的动态规划题,定义动态数组,这里定义dp[i][j]表示,到达grid数组的坐标为(i,j)位置的最小路径和,初始化动态dp数组,赋初始值,注意边界条件和非边界条件的赋值,具体实现看代码及注释。

代码实现:

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        # 数组不存在的边界条件
        if not grid or not grid[0]:
            return 0
        
        row, col = len(grid), len(grid[0])
        # 初始化动态规划dp数组,dp[i][j] 表示从左上角出发到 (i,j)位置的最小路径和
        dp = [[0] * col for _ in range(row)]
        dp[0][0] =  grid[0][0]

        # 左边界,即grid数组的第一列元素:dp[i][0]
        # 计算到达这些元素的最小路径和,则只能从上边向下边移动到达再加上当前的元素值
        # 即:当j=0 且 i>0时,dp[i][0] = dp[i - 1][0] + grid[i][0]
        for i in range(1, row):
            dp[i][0] = dp[i - 1][0] + grid[i][0]

        # 上边界,即grid数组的第一行元素:dp[0][j],
        # 计算到达这些元素的最小路径和,则只能从左边向右移动到达再加上当前的元素值
        # 即:当 i=0 且 j>0时,dp[0][j] = dp[0][j−1] + grid[0][j]
        for j in range(1, col):
            dp[0][j] = dp[0][j - 1] + grid[0][j]

        # 非边界元素,计算到达这些元素的最小路径和,可以从左边或上边移动到达,
        # 即:当i > 0 且 j > 0时,dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + gird[i][j]
        for i in range(1, row):
            for j in range(1, col):
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]

        # dp数组的最后一个元素,即右下角元素就是最后从左上到右下叠加计算过后的最小路径和
        return dp[-1][-1]

参考文献:
https://leetcode-cn.com/problems/minimum-path-sum/solution/zui-xiao-lu-jing-he-by-leetcode-solution/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值