题目
给定一个包含非负整数的 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]