一、题目描述
题目原文:
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.
给定一个 M×N 的,元素为非负数的矩阵,找出从左上角元素到左下角元素经过的最短路径,并输出。
注意:其实note很有用的,只能向右走或者向下走。恩~若有所思~
二、题目分析
思路:
(错误:期初我想既然每次只能往右或者往下走,那我每次只需要比较一下右面和下面方格的值哪个小选哪个就可以了,但是细想局部最优≠整体最优,大家简单画个图就知道了~)
从头捋捋,假设M和N都很大,只能向右走,那么第一行的每个方格的最短路径的唯一确定的,长度即为当前方格内数字加上列数在当前方格之前的所有方格内数字之和;第一列同理。那么要求第二行第二列方格的最短路径:只需要比较一下第一行第二列方格最短路径值与第二行第一列方格的最短路径值哪一个更小,小的数值加上当前方格内数值即为所求.......要求第i行第j列方格的最短路径:只需要比较一下第i行第j-1列方格最短路径值与第i-1行第j列方格的最短路径值哪一个更小,小的数值加上当前方格内数值即为所求。
所以最终思路为:循环M×N方格矩阵,依次求出从左上角方格到当前的最短路径并记录在当前方格中,直至运算到右下角方格即可。
三、Python代码
class Solution(object): def minPathSum(self, grid): """ :type grid: List[List[int]] :rtype: int """ # 求出矩阵行列数:m为行数n为列数 m = len(grid) n = len(grid[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] # 从第二行第二列开始循环矩阵,根据比较第i行第j-1列方格最短路径值与第i-1行第j列方格的最短路径值哪一个更小,小的数值加上当前方格内数值即为从左上角方格到当前方格的最短路径值,并用该值更新当前方格保存值。 for i in range(1, m): for j in range(1, n): # 温馨提示:python里并没有条件运算符“ 判断条件 ? 判断条件正确值 : 判断条件错误值”,但是有类似的操作,如下例所示。 grid[i][j] += (grid[i][j-1] if grid[i][j-1] < grid[i-1][j] else grid[i-1][j]) return grid[m-1][n-1]
四、其他
题目链接:https://leetcode.com/problems/minimum-path-sum/
Runtime: 49ms
测试用例:61 / 61
想法不够优化,欢迎大家留言交流~