要求
给定一个包含非负整数的 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
核心代码
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
if not grid:
return 0
m = len(grid)
n = len(grid[0])
dp = [[0] * n] * m
for i in range(m):
for j in range(n):
if not i and not j:
dp[i][j] = grid[i][j]
elif not i and j:
dp[i][j] = dp[i][j-1] + grid[i][j]
elif not j and i:
dp[i][j] = dp[i-1][j] + grid[i][j]
else:
dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]
return dp[m-1][n-1]
解题思路:动态规划,因为我们只能向右或者向下走,所以当我们的数据在第[0][0]的位置上的时候,直接赋值即可,在第一排的时候,我们向右走,只能从左侧的值加上现有的位置的值,在第一列的时候,我们向下走,只能从上面的值加上现有的位置的值,当不在原点、第一排、第一列的时候,我们可以从左侧向右走、或者从上向下走,取两者最小值加上现有位置的值即可。