LeetCode刷题之64.最小路径和
我不知道将去向何方,但我已在路上! |
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |
- 题目:
给定一个包含非负整数的 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:
dp = [[0]*len(grid[0])]*len(grid)
for i in range(len(grid)):
for j in range(len(grid[0])):
if i == 0 and j == 0:
dp[i][j] = grid[i][j]
elif i == 0 and j > 0:
dp[i][j] = dp[i][j-1] + grid[i][j]
elif j == 0 and i > 0:
dp[i][j] = dp[i-1][j] + grid[i][j]
if i >= 1 and j >= 1:
dp[i][j] = min(dp[i][j-1] + grid[i][j],dp[i-1][j] + grid[i][j])
return dp[-1][-1]
- 算法说明:
采用动态规划算法,建立一个和grid一样大小的全为0的动态矩阵dp,对照矩阵grid对矩阵dp进行更新。先将第一行和第一列分别采取向右和向下的办法进行更新,然后更新其他的值,dp中每一个元素,求出其上方和左方的较小者,然后和自身的加和来更新。具体过程如下: