zoukankan      html  css  js  c++  java
  • 【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]
  • 相关阅读:
    【杭电】[1302]The Snail
    【Light】[1297]Largest Box
    ubuntu10.04安装putty以保存SSH会话
    印象笔记导入为知笔记方法
    HTTP返回状态码及错误大全
    Ubuntu14.04安装wineqq国际版
    Ubuntu Unity 桌面快捷键切换窗口技巧
    Ubuntu14.04下安装为知笔记
    在ubuntu中如何管理startup application
    Error:" Can't locate Term/ReadKey.pm in @INC" 的解决方法
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10763400.html
Copyright © 2011-2022 走看看