Day17-Minimum Path Sum
问题描述:
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.
解法一:
这题应该就是属于动态规划范围的题。可以设置一个数组存储到每个位置的最小路径和。而每个位置的最小路径和只与当前位置和右面,上面有关。在遍历每个位置之前要先写出第一个元素和第一行,第一列的最小路径和。
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
#动态规划:当访问到(i,j)位置时,当前位置的最小值和,为当前位置的值和(i-1,j),(i,j-1)位置两者之间最小值的和
#所以设置一个数组存储每个位置的最小值
#首先需要设置第一行和第一列的最小值,因为它们分别没有上面和左面的值
m = len(grid)#行
n = len(grid[0]) # 列
result = [[0] * n for i in range(m)]
result[0][0] = grid[0][0]
for i in range(1,m):
result[i][0] = result[i - 1][0] + grid[i][0]
for i in range(1,n):
result[0][i] = result[0][i - 1] + grid[0][i]
for i in range(1,m):
for j in range(1,n):
result[i][j] = grid[i][j] + min(result[i-1][j],result[i][j-1])
return result[m-1][n-1]
时间复杂度为O(mn),空间复杂度为O(mn)
解法二:
也可以不用设置额外的数组,直接用grid来表示,当访问到i,j都为0是跳过,说明当前位置为第一个元素,就是最小值,当访问到i = 0时,直接加上前一个元素,说明当前位置为第一行的元素。相同如果访问到第一列时加上上一个元素。否则比较前一个和上一个元素的最小值,将最小值加上当前位置。
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m = len(grid)
n = len(grid[0])
for i in range(m):
for j in range(n):
if i == 0 and j == 0:
continue
elif i == 0:
grid[i][j] += grid[i][j-1]
elif j == 0:
grid[i][j] += grid[i-1][j]
else:
grid[i][j] += min(grid[i-1][j],grid[i][j-1])
return grid[m-1][n-1]
时间复杂度为O(m*n),空间复杂度为O(1)
这道题应该还有时间复杂度更小的解法。。。以后研究一下。