1 问题
给定一个包含非负整数的 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
2 答案
自己写的,参考上一题,动态规划
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m = len(grid)
n = len(grid[0])
dp = [[0]*n for _ in range(m)]
dp[0][0] = grid[0][0]
for j in range(1, n):
dp[0][j] = dp[0][j-1] + grid[0][j]
for i in range(1, m):
dp[i][0] = dp[i-1][0] + grid[i][0]
for i in range(1, m): # range(m) 也会运行,但是不对,i=0时,[i-1]默认0
for j in range(1, n):
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
return dp[-1][-1]
再次尝试,对空间进行优化,使用O(n)空间
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
cur = [sum(grid[0][:i+1]) for i in range(len(grid[0]))]
m = len(grid)
n = len(grid[0])
for i in range(1, m):
for j in range(0, n):
if j == 0:
cur[j] = sum([a[0] for a in grid[:i+1]]) # 第一列的值应该是该位置的上面所有值的和(包括该位置)
else:
cur[j] = grid[i][j] + min(cur[j-1], cur[j])
return cur[-1]
官方解,思路完全一样
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
if not grid: return 0
row = len(grid)
col = len(grid[0])
dp = [[0]*col for _ in range(row)]
dp[0][0] = grid[0][0]
# 第一行
for j in range(1, col):
dp[0][j] = dp[0][j-1] + grid[0][j]
# 第一列
for i in range(1, row):
dp[i][0] = dp[i-1][0] + grid[i][0]
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]
return dp[-1][-1]
https://leetcode.cn/problems/minimum-path-sum/solutions/5888/zi-di-xiang-shang-he-zi-ding-xiang-xia-by-powcai/