版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击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 查看本文章