https://leetcode.cn/problems/minimum-path-sum/submissions/
Tips
- 使用列表生成式时代码用时更少,但是不熟练的话不建议使用。
dp = [[0]*columns for _ in range(rows)] - 直接使用copy()方法用时长,而且列表的初始值不为0。
dp = grid.copy() - 也可以将代码空间复杂度直接变为O(1),在grid上直接修改。
- 此题为dynamic programming的二维形式的题,与一维度相比,需要考虑好边界条件以及使用两个for循环,其本质与1D相同。
- 了解状态-状态转移方程-最优子结构-重叠子问题,较为熟练后尽量牺牲空间来避免递归(Tabulation and Memorization)。
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
if not grid[0]: return 0
rows, columns = len(grid), len(grid[0])
# 使用列表生成式时代码用时更少,但是不熟练的话不建议使用
# dp = [[0]*columns for _ in range(rows)]
# 直接使用copy()方法用时长,而且列表的初始值不为0
dp = grid.copy()
for i in range(rows):
for j in range(columns):
if i==0 and j==0:
dp[i][j] = grid[i][j]
elif j==0:
dp[i][j] = grid[i][j] + dp[i-1][j]
elif i==0:
dp[i][j] = grid[i][j] + dp[i][j-1]
else:
dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])
return dp[rows-1][columns-1]