题目描述
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例输入:
[ [1,3,1],
[1,5,1],
[4,2,1]]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
思路
因为只能向右或者向下移动,要走到走到在第i行第j列的网格,必须是从第i-1行第j列的网格或者第i行第j-1列的网格移动过来,假设二维数组dp[i][j]表示在第i行第j列的网格上的最小数字总和
初始化dp所有的元素均为0,在网格的第一行和第一列的所有路径和应该都是固定的,因为都是向右或者向下移动
而当位置(i,j)处时,dp[i][j] = min(dp[i-1][j] +grid[i][j],dp[i][j-1]++grid[i][j]),另外,二维数组是额外的辅助空间,如果将直接将原数组grid来存储dp数组的结果,边遍历边更新,对grid进行原地修改,可降低空间复杂度,如下
python3实现
from typing import List
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m = len(grid)
n =len(grid[0])
#在网格的第一行和第一列的所有路径和应该都是固定的,直接向右或者向下移动相加:
for i in range(1,m):
grid[i][0] += grid[i-1][0]
for j in range(1,n):
grid[0][j] += grid[0][j-1]
#非第一行和非第一列:
for i in range(1,m):
for j in range(1,n):
grid[i][j]= min(grid[i-1][j] + grid[i][j], grid[i][j-1] + grid[i][j] )
return grid[-1][-1]
测试
if __name__ == "__main__":
s=Solution()
t=[[1,3,1],
[1,5,1],
[4,2,1]]
print(s.minPathSum(t))
# result
7
欢迎关注公众号-算法学习总结,获取更多题解