LeetCode 64. Minimum Path Sum

简介: 给定m x n网格填充非负数,找到从左上到右下的路径,这最小化了沿其路径的所有数字的总和。注意:您只能在任何时间点向下或向右移动。

v2-8056f513ed1904a6b8592c32146ec91b_1440w.jpg

Description


Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.


Note: You can only move either down or right at any point in time.


Example:

Input:

[

[1,3,1],

[1,5,1],

[4,2,1]

]

Output: 7

Explanation: Because the path 1→3→1→1→1 minimizes the sum.


描述



给定m x n网格填充非负数,找到从左上到右下的路径,这最小化了沿其路径的所有数字的总和。

注意:您只能在任何时间点向下或向右移动。


思路



  • 这道题是给定一个m * n的矩阵,让从左上角走到右下角,每一个位置都有一个权重,让返回一条路径上所有权重和,要求是此和最小.
  • 这道题同第62题,第63题思路非常类似,第62题解析在这里,第63题在这里.
  • 我们假设有矩阵Matrix[m][n],矩阵Matrix[i][j]位置只能由Matrix[i-1][j]和Matrix[i][j-1]到达.
  • 因此,到达Matrix[i][j]的最短路径 = Min {Matrix[i-1][j],Matrix[i][j-1]} + Matrix[i][j]
  • 即到达矩阵当前位置的最小权重路径 = {到达矩阵当前位置左边的最小权重路径,到达矩阵当前位置上边的最小权重路径}中的最小值 + 矩阵当前位置的权重


class Solution:
    # 递归版本,当前位置最小值 = min{当前位置左边最小值,当前位置上边最小值}+当前位置的值
    def __init__(self):
        # 声明结果矩阵,用于记录已经遍历过的位置
        self.res = []
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # 入股gird为空,则直接返回
        if not grid:
            return 0
        # 获取最大行的索引,获取最大列的索引
        row, col = len(grid)-1, len(grid[0])-1
        # 初始化第一行,每一个位置的最短路径 = 左边的最短路径+本身的值
        for i in range(1, col+1):
            grid[0][i] += grid[0][i-1]
        # 初始化第一列,每一个位置的最短路径 = 上边的最短路径+本身的值
        for i in range(1, row+1):
            grid[i][0] += grid[i-1][0]
        # 初始化结果矩阵,-1表示当前位置还没有遍历过
        self.res = [[-1 for _ in range(col+1)] for _ in range(row+1)]
        return self.recur(row, col, grid)
    def recur(self, row, col, grid):
        # 如果到达矩阵左上角的位置,返回此位置的路径值
        if row == 0 and col == 0:
            return grid[0][0]
        # 如果到达第一行但不是最坐上角
        elif row == 0:
            return grid[0][col]
        # 如果到达第一列但不是最左上角
        elif col == 0:
            return grid[row][0]
        # 如果当前位置已经遍历过
        elif self.res[row][col] != -1:
            return self.res[row][col]
        # 求矩阵当前位置做左边的最小值
        left = self.recur(row, col-1, grid)
        # 求矩阵当前位置上边的最小值
        top = self.recur(row-1, col, grid)
        # 记录矩阵当前位置的值
        self.res[row][col] = min(left, top)+grid[row][col]
        # 返回矩阵当前位置的值
        return self.res[row][col]
class Solution2:
    # 循环版本实现,当前位置最小值 = min{当前位置左边最小值,当前位置上边最小值}+当前位置的值
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # 如果gird矩阵为空,则直接返回
        if not grid:
            return 0
        # 获得行的最大索引,获得列的最大索引
        row, col = len(grid)-1, len(grid[0])-1
        # 初始化第一行,当前位置最短路径 = 当前位置左边最短路径 + 当前位置的值
        for i in range(1, col+1):
            grid[0][i] += grid[0][i-1]
        # 初始化第一列,当前位置最短路径 = 当前位置上边最短路径 + 当前位置的值
        for i in range(1, row+1):
            grid[i][0] += grid[i-1][0]
        # 遍历每一个位置,当前位置最短路径 = min {当前位置左边最短路径,当前位置上边最短路径} + 当前位置的值
        for i in range(1, row+1):
            for j in range(1, col+1):
                grid[i][j] = min(grid[i-1][j], grid[i][j-1])+grid[i][j]
        return grid[row][col]


源代码文件在这里.


目录
相关文章
Leetcode Minimum Depth of Binary Tree (面试题推荐)
计算树的最小深度 很简单的一道题,只需要遍历一次树,到叶子节点的时候计算一下深度和当前最小深度比较,保存最小值就行。 我在这用了一个全局变量 mindepth。总感觉我这代码写的不够简练,求更精简的方法。
51 0
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode 433. Minimum Genetic Mutation
现在给定3个参数 — start, end, bank,分别代表起始基因序列,目标基因序列及基因库,请找出能够使起始基因序列变化为目标基因序列所需的最少变化次数。如果无法实现目标变化,请返回 -1。
70 0
LeetCode 433. Minimum Genetic Mutation
|
存储
LeetCode 329. Longest Increasing Path in a Matrix
给定一个整数矩阵,找出最长递增路径的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
78 0
LeetCode 329. Longest Increasing Path in a Matrix
|
存储 索引
LeetCode 310. Minimum Height Trees
对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。
76 0
LeetCode 310. Minimum Height Trees
LeetCode 209. Minimum Size Subarray Sum
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
123 0
LeetCode 209. Minimum Size Subarray Sum
|
Go
LeetCode 124. Binary Tree Maximum Path Sum
给定一个非空二叉树,返回其最大路径和。 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
71 0
LeetCode 124. Binary Tree Maximum Path Sum
LeetCode 111. Minimum Depth of Binary Tree
给定一棵二叉树,返回其最短深度. 题目要求是返回一颗二叉树从根节点到到所有叶节点中,深度最小的值.
82 0
LeetCode 111. Minimum Depth of Binary Tree
|
Unix Python
LeetCode 71. Simplify Path
给定文件的绝对路径(Unix下的路径)字符串,简化此字符串。
91 0
LeetCode 71. Simplify Path
|
人工智能 算法
LeetCode 1347. 制造字母异位词的最小步骤数 Minimum Number of Steps to Make Two Strings Anagram
LeetCode 1347. 制造字母异位词的最小步骤数 Minimum Number of Steps to Make Two Strings Anagram