此题解采用动态规划的方法来求解最小路径和问题。定义一个二维数组 dp,其中 dp[i][j] 表示从左上角 (0, 0) 到位置 (i, j) 的最小路径和。初始化 dp[0][0] 为起点的值 grid[0][0]。对于网格的其他位置,如果位置在第一行,只能从左边的位置到达;如果位置在第一列,只能从上面的位置到达;对于其他位置,则需要考虑从左边或上面到达的路径中哪一条的路径和更小。最后,dp数组的最右下角的值即为整个网格的最小路径和。
时间复杂度: O(m * n)
空间复杂度: O(m * n)
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
rows = len(grid)
cols = len(grid[0])
# dp[i][j] 代表从 (0,0) 到 (i,j) 的最小路径和
dp = [[0] * cols for _ in range(rows)]
for i in range(rows):
for j in range(cols):
if i == 0 and j == 0: # 起点初始化
dp[i][j] = grid[i][j]
elif i != 0 and j != 0: # 可以从左边或上边到达
dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])
elif i == 0 and j != 0: # 第一行,只能从左边到达
dp[i][j] = grid[i][j] + dp[i][j-1]
elif i != 0 and j == 0: # 第一列,只能从上面到达
dp[i][j] = grid[i][j] + dp[i-1][j]
return dp[rows-1][cols-1]