【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]
posted @ 2019-04-24 17:01  GoodRnne  阅读(338)  评论(0编辑  收藏  举报