给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自下往上给二维列表的本身做最小的自加 判断相邻的和的最小值 并赋值给对应位置
class Solution(object):
def minimumTotal(self, triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
for i in range(len(triangle)-2, -1, -1):
for j in range(len(triangle[i])):
triangle[i][j] = min(triangle[i+1][j]+triangle[i][j],triangle[i+1][j+1]+triangle[i][j])
return triangle[0][0]
自上往下添加最小值 需要判断特殊情况 在第一个最后位置的情况 因为只能接触相邻节点 直接添加不需要对比值的大小
class Solution(object):
def minimumTotal(self, triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
dp = triangle #这边的初始化真的是牛逼,不仅不需要把把上面两行特殊的情况考虑进去,而且为下面也做了铺垫。因为是做累加,所以不需要初始化为0
m = len(dp)
#dp是一个list列表,同样也可以看成是一个二维数组,如图所示
# [ [
# 2, [2],
# 3,4 [3,4],
# 6,5,7 [6,5,7],
# 4,1,8,3 [4,1,8,3]
# ] ]
# 可以知道3的下一行中相邻的结点为6和5,6的下一行中相邻的结点为4和1,5的下一行中相邻的结点为1和8
for i in range(1, m): # 对第一行的元素,不需要初始化。如:到2的最短路径就是2
for j in range(i+1):
if j == 0:
dp[i][j] += dp[i-1][j] #第一列的元素来源路径只可能是由上一行对应列的元素移动而来
if j> 0 and j == i:
dp[i][j] += dp[i-1][j-1]
# 在对角线上的元素 如:4的来源路径只有可能是从2来
# PS:虽然在上面左边图中,4和6好像是相邻的,但是在三角形中,4和6不相邻
# 我的理解就是根据题目要求得到上面左边的图,移动方式只有向下和像45度方向移动两种情况
elif (j > 0 and j < i):
dp[i][j] += min(dp[i-1][j-1],dp[i-1][j]) #求两种移动路径的最小值
return (min(dp[m-1]))