LeetCode刷题——64. 最小路径和

题目

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

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

示例:

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-path-sum

思路

这个题目和120. 三角形最小路径和很像,解法是类似的。

所以这里直接通过自底向上动态规划的方式来求解。沿着移动方向相反的方向,即从右下角开始计算,向上或向左。

需要考虑边界情况。

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        # 从右下角开始计算,向上或向左
        m, n = len(grid), len(grid[0])  # m x n 的矩阵

        for col in range(n - 2, -1, -1):
            grid[m - 1][col] += grid[m - 1][col + 1]  # 最后一层(m-1)的直接向左累加

        for row in range(m - 2, -1, -1):
            grid[row][n - 1] += grid[row + 1][n - 1]  # 最后一列(n-1)只要向上计算即可

		# 上面是考虑边界情况
        for row in range(m - 2, -1, -1):  # 从倒数第2层开始
            for col in range(n - 2, -1, -1):  # 从倒数第2列开始
                grid[row][col] += min(
                    grid[row + 1][col], grid[row][col + 1]
                )

        return grid[0][0]

LeetCode刷题——64. 最小路径和_第1张图片

你可能感兴趣的:(在线编程,#,动态规划)