lintcode练习- 109. 数字三角形

版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击666! https://blog.csdn.net/qq_36387683/article/details/81865805

109. 数字三角形

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

样例

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

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

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

注意事项

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

解题思路:

1、定义一个和数字三角形形状相等的数组

2、数组的第一行为三角形的第一行,因为第一行的路径和一定是自身

3、遍历三角形的行,对每行的数算出到前一行的最佳路径。

4、因为只能移动到相邻的数字,所以每行的第一个数字和最后一个数字,只能从前一行的第一个数字和最后一个数字移动过来

5、对于其他数字,可以有两个方向移动得来,取他们之间的最小值。

6、返回最后一行的最小值,就是最小路径和。

class Solution:
    """
    @param triangle: a list of lists of integers
    @return: An integer, minimum path sum
    """
    def minimumTotal(self, triangle):
        # write your code here
        #定义一个数组,记录每层的最优解
        dp =[[0] * (len(triangle[i])) for i in range(len(triangle))]
        dp[0] = triangle[0]
        
        for i in range(1, len(triangle)):
            for j in range(len(triangle[i])):
                if j == 0:
                    dp[i][j] = triangle[i][j] + dp[i-1][j]
                elif j == len(triangle[i]) - 1:
                    dp[i][j] = triangle[i][j] + dp[i-1][j-1]
                else:
                    dp[i][j] = min(triangle[i][j] + dp[i-1][j-1], triangle[i][j] + dp[i-1][j])
        
        return min(dp[len(triangle)-1])
        

扫描二维码关注公众号,回复: 2980319 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/81865805