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]
  • 相关阅读:
    GNU风格 汇编语法总结(转)
    CPSR和SPSR(转)
    C语言调用汇编实现字符串对换
    ubuntu如何跑arm程序
    Shell编程之函数调用
    arm汇编--ubuntu12.04 安装arm-linux交叉编译环境
    linux关于bashrc与profile的区别(转)
    Shell如何传递字符串
    打印指针指向的地址值
    在CentOS 6.4中支持exfat格式的U盘
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10763400.html
Copyright © 2011-2022 走看看