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/