Leetcode 64. 最小路径和
中等题; 本题和Leetcode 62. 不同路径【动态规划】类似的思想。
题目
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例1
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
示例2
输入:grid = [[1,2,3],[4,5,6]]
输出:12
提示
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 200
- 0 <= grid[i][j] <= 100
解法
压缩空间的动态规划
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
dp = [40001 for _ in range(n+1)] # 100*(200*200)+1 最大的路径和不超过40001
dp[1] = 0
for i in range(1,m+1):
for j in range(1,n+1):
dp[j] = min(dp[j], dp[j-1]) + grid[i-1][j-1]
return dp[n]
- 时间复杂度 O(mn)
- 空间复杂度 O(n)
也可以直接使用grid数组作为dp数组来记录每个位置的路径最小和;
class Solution:
def minPathSum(self, grid: [[int]]) -> int:
for i in range(len(grid)):
for j in range(len(grid[0])):
if i == j == 0: continue
elif i == 0: grid[i][j] = grid[i][j - 1] + grid[i][j] #由上得来
elif j == 0: grid[i][j] = grid[i - 1][j] + grid[i][j] #由左得来
else: grid[i][j] = min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j]
return grid[-1][-1]
- 时间复杂度 O(mn)
- 空间复杂度 O(1)