給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
例如,給定三角形:
[
[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]))