给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
解题思路:
动态规划
核心公式: matrix[i][j] += min(matrix[i-1][j], matrix[i][j-1])
单独处理一下首行与首列(因为只能向下和向右行走),从[1][1]位置开始遍历,右下角元素即为所求
代码:
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m = len(grid)
n = len(grid[0])
if m == 0:
return 0
for i in range(1,n):
grid[0][i] += grid[0][i-1]
for i in range(1,m):
grid[i][0] += grid[i-1][0]
for i in range(1, m):
for j in range(1, n):
grid[i][j] += min(grid[i-1][j], grid[i][j-1])
return grid[m-1][n-1]
两天没发博客是因为一直在准备虎牙昨晚的笔试,sql练得很少就抓紧突击一下,虎牙笔试考的好全面,具体到卷积核size,维度规约,T检验。。。从传统统计到机器学习再到深度学习真的是什么都问,简单说一下应该是最难的一道编程题,跟上面的题很相似:
n*n的矩阵,每个格子内是0或正整数,从左上到右下走两趟,只能向右或向下行走,把走过的格子内的数加在一起,求最大值,第一趟走过的格子第二次再走,只算一次。
因为这个不能提交我也不知道做的对不对,我的做法也是用动态规划,
核心公式改为:matrix[i][j] += max(matrix[i-1][j], matrix[i][j-1])
不过每走过一个格子都重新赋值为0,直接附代码吧
def minPathSum(grid):
n = len(grid)
for i in range(1,n):
grid[0][i] += grid[0][i-1]
for i in range(1,n):
grid[i][0] += grid[i-1][0]
for i in range(1, n):
for j in range(1, n):
grid[i][j] += max(grid[i-1][j], grid[i][j-1])
if grid[i-1][j] >= grid[i][j-1]:
grid[i-1][j] = 0
else:
grid[i][j-1] = 0
sum = grid[n-1][n-1]
grid[n-1][n-1] = 0
return sum, grid
sum_1, grid_1 = minPathSum(grid)
sum_2, grid_2 = minPathSum(grid_1)
sum = sum_1 + sum_2
这版跟我考试写的不太一样,回忆的时候发现考试的那个应该是错了,重新赋值的地方出了点问题,大体思路应该是没错的。。