该题解使用动态规划的方法,通过递归的方式从左上角到右下角计算最短路径和。使用记忆化搜索避免重复计算已经计算过的子问题。具体思路是:对于网格中的每个位置 (i, j),最短路径和等于上方 (i-1, j) 和左方 (i, j-1) 两个位置的最短路径和的较小值,再加上当前位置的值 grid[i][j]。通过递归和记忆化,自底向上地计算出整个网格的最短路径和。
时间复杂度: O(m * n)
空间复杂度: O(m * n)
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
memo = dict()
def dp(i, j):
# 如果当前位置已经计算过,直接返回记忆化的结果
if (i, j) in memo:
return memo[(i, j)]
# 如果越界,返回无穷大
if i < 0 or j < 0:
return float('inf')
# 如果到达起点,返回起点的值
if i == 0 and j == 0:
return grid[0][0]
# 递归计算上方和左方位置的最短路径和,取较小值,加上当前位置的值
res = min(dp(i-1, j), dp(i, j-1)) + grid[i][j]
# 记忆化当前位置的结果
memo[(i, j)] = res
return res
# 调用递归函数,从终点开始计算
return dp(len(grid)-1, len(grid[0])-1)