给定一个用非负数填充的m x n网格,请找到一条从左上方到右下方的路径,该路径将沿其路径的所有数字的总和最小。
注意:只能在任何时间点向下或向右移动。
Input: [ [1,3,1], [1,5,1], [4,2,1] ]
Output: 6
Input: [ [1,2,5], [3,2,1] ]
Output: 6
Clue: 求出到每个点的最小值, 一直到最后一位。
1. 首先设置一个临时的矩阵用来存储加和结果
2. 求出第一行和第一列的加和
3. 求出内部的加和最小值,即上面和左面的最小值加上当前位置的值
4. 返回最后一个位置的值
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m=len(grid) #行数
n=len(grid[0]) #列数
temp=[[0]*n for _ in range(m)]
temp[0][0]=grid[0][0]
for f_row in range(1,n): #每行有n个
temp[0][f_row]=grid[0][f_row]+temp[0][f_row-1]
for f_col in range(1,m): #每列有m个
temp[f_col][0]=grid[f_col][0]+temp[f_col-1][0]
for row in range(1,m):
for col in range(1,n):
temp[row][col]=grid[row][col]+min(temp[row-1][col],temp[row][col-1])
return temp[-1][-1]
由于初始化临时矩阵需要空间和时间,优化上面的算法可以直接省略掉临时矩阵,每次得到的加和最小值直接替换掉给定的矩阵对应位置的值。
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m=len(grid)
n=len(grid[0])
for f_row in range(1,n):
grid[0][f_row]=grid[0][f_row]+grid[0][f_row-1]
for f_col in range(1,m):
grid[f_col][0]=grid[f_col][0]+grid[f_col-1][0]
for row in range(1,m):
for col in range(1,n):
grid[row][col]+=min(grid[row-1][col],grid[row][col-1])
return grid[-1][-1]
比优化前的时间复杂度降低了并且空间复杂度也减小了。