解题思路-leetcode第六十四题:最小路径和
题目描述:
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
解题思路:本题适用于动态规划方法,将大问题化解为小问题,从某一点到终点的解就等于其左边元素和上方元素的解之中的最小值加上本身的值,我们通过在原矩阵中修改,将每一个位置的值改为从开始点到该位置的最小路径值,对于第一行和第一列,因为其只能向特定方向移动,所以处于第一行或第一列的元素,其解就等于其前一元素的解或上一元素的解加上自身的值,而对于其余元素,其解就等于其左边元素和上方元素的解之中的最小值加上本身的值。最后返回矩阵最后一个元素的值。代码如下:
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
if not grid:
return 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if i == 0:
if j > 0:
grid[i][j] += grid[i][j-1]
elif j == 0:
if i > 0:
grid[i][j] += grid[i-1][j]
else:
grid[i][j] += min(grid[i-1][j], grid[i][j-1])
return grid[-1][-1]
提交后,通过。