题目:给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
虽然这道题是mid难度,但是做起来并没有mid的难度。
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
n,m=len(grid[0]),len(grid)
for i in range(m):
for j in range(n):
if i-1>=0 and j-1>=0:
grid[i][j]=min(grid[i-1][j],grid[i][j-1])+grid[i][j]
elif i-1>=0 and j-1<0:
grid[i][j]=grid[i-1][j]+grid[i][j]
elif i-1<0 and j-1>=0:
grid[i][j]=grid[i][j-1]+grid[i][j]
return grid[-1][-1]
题目中最重要的信息就是说明这段话。
这段话可以推导出dp(动态规划)的规律。
走到某一个点,出发点只能是从这个点的前面一个点 或者 上面一个点。
写了3个if判断
第一个是前面和上面这个点存在。(i 指的是第i行,j指的是第j列)
if i-1>=0 and j-1>=0:
那肯定就是取两个点中值比较小的点,然后加上本生咯。
第二个是如果上面的点存在,但是前面的点不存在。
elif i-1>=0 and j-1<0:
那只能是上面这个点的值加上这个点的值咯
第三个是如果上面的的点不存在,但是前面的点存在。
elif i-1<0 and j-1>=0:
同理!
可能会想,不是还有第四情况吗,俩个点都不存在。这个情况会发生在(0,0)这个位置,不用特别分析,这个点值。
这个题目特殊的地方是它不需要其他额外空间取存dp(80%的动态规划需要再拿出一些空间存储)。原因就是可以在原有的grid空间内直接改变之中的值。
小王还会分享其他力扣做题体会心得哦。感谢关注 O vv O!