【LeetCode每天一题】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.
思路
这道题我们可以使用回溯法,动态规划。但是回溯法的时间复杂度太高。当m,n比较大时时间复杂度会比较高,会出现时间复杂度超时的情况。因此我直接使用动态规划来解决。 这里的动态方程为 dp[i][j] = min(dp[i-1][j], dp[i][j-1])+nums[i][j]。时间复杂度为O(m*n), 空间复杂度为O(n),
解决代码
1 class Solution(object):
2 def minPathSum(self, nums):
3 """
4 :type grid: List[List[int]] # 这一个我们采用的是申请一个辅助矩阵来解决问题,所以这个方法的空间复杂度为O(n*m)。
5 :rtype: int
6 """
7 if not nums:
8 return 0
9 m , n = len(nums), len(nums[0])
10 dp = []
11 for i in range(m): # 申请辅助空间
12 dp.append([0]*n)
13 dp[0][0] = nums[0][0]
14 for i in range(1, m): # 初始第一列
15 dp[i][0] = dp[i-1][0] + nums[i][0]
16 for i in range(1,n): # 初始化第一行
17 dp[0][i] = dp[0][i-1] + nums[0][i]
18
19 for i in range(1, m): # 从第二行第二个元素开始直到最后一个
20 for j in range(1, n):
21 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + nums[i][j]
22 return dp[m-1][n-1]
空间复杂度为O(n)的解法
1 class Solution(object):
2 def minPathSum(self, nums):
3 """
4 :type grid: List[List[int]]
5 :rtype: int
6 """
7 if not nums:
8 return 0
9 m , n = len(nums), len(nums[0])
10 dp = [0]*n # 申请一个长度为n的辅助数组
11 dp[0] = nums[0][0]
12 for i in range(1, n): # 先对第一行进行初始化
13 dp[i] = dp[i-1] + nums[0][i]
14
15 for i in range(1, m): # 然后从第二行开始
16 dp[0] += nums[i][0] # 每一行第一个元素只能从上面达到。
17 for j in range(1, n):
18 dp[j] = min(dp[j], dp[j-1]) + nums[i][j]
19
20 return dp[-1]