LintCode Python 简单级题目 109.数字三角形

原题描叙 :

给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。

 注意事项

如果你只用额外空间复杂度O(n)的条件下完成可以获得加分,其中n是数字三角形的总行数。

样例

比如,给出下列数字三角形:

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。

题目分析:

思路:

  从二维数组的倒数第二行开始往上,每一行的元素改为下一行能与之相加的两个数较小者与其相加之后的和,如题中给出的例子,步骤为:

  

  [                                 [            [
       [2],              [2],          [11]
      [3,4],    →        [9,10]   →     ]
     [7,6,10]           ]
  ]

参照:http://www.cnblogs.com/xiaocainiao2hao/p/5359892.html

class Solution:
    """
    @param triangle: a list of lists of integers.
    @return: An integer, minimum path sum.
    """
    def minimumTotal(self, triangle):
        # write your code here
        n = len(triangle)
        if triangle is None:
            return None
        elif triangle[0][0] is None:
            return None
        elif n == 1: # 此处if分支可省略
            return triangle[0][0]
            
        # 将triangle[i+1][j]和triangle[i+1][j+1]中的小值加到上一行的triangle[i][j]中
        for i in range(n-2,-1,-1):
            le = len(triangle[i])
            for j in range(0,le):
                minx = min(triangle[i+1][j],triangle[i+1][j+1])
                triangle[i][j] += minx
        return triangle[0][0]

  

原文地址:https://www.cnblogs.com/bozhou/p/6945947.html