LeetCode64. 最小路径和(python)

给定一个包含非负整数的 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

这版跟我考试写的不太一样,回忆的时候发现考试的那个应该是错了,重新赋值的地方出了点问题,大体思路应该是没错的。。

你可能感兴趣的:(LeetCode)