給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
相鄰的結點 在這裡指的是 下標 與上一層結點下標相同或者等於上一層結點下標 + 1的兩個結點。
自頂向下的最小路徑和為11
(即,2+3+5+1= 11)。
如果你可以只使用 o(n) 的額外空間(n 為三角形的總行數)來解決這個問題,那麼你的演算法會很加分。
相鄰結點:與(i, j) 點相鄰的結點為 (i + 1, j) 和 (i + 1, j + 1)。
自下向上
class solution(object):
# modify the original ********, bottom-up
def minimumtotal(self, ********):
""":type ********: list[list[int]]
:rtype: int
"""if not ********:
return
for i in range(len(********) - 2, -1, -1):
for j in range(len(********[i])):
********[i][j] += min(********[i + 1][j], ********[i + 1][j + 1])
return ********[0][0]
# bottom-up, o(n) space
def minimumtotal2(self, ********):
if not ********:
return
res = ********[-1] # 轉一維res = list(********[-1])
for i in range(len(********) - 2, -1, -1):
for j in range(len(********[i])):
res[j] = min(res[j], res[j + 1]) + ********[i][j]
return res[0]
s = solution()
******** = [[2], [3, 4], [6, 5, 7], [4, 1, 8, 3]]
print(s.minimumtotal(********))
********2 = [[2], [3, 4], [6, 5, 7], [4, 1, 8, 3]]
print(s.minimumtotal2(********2))
120 三角形最小路徑和
我現在知道怎麼結合遞迴和動態規劃的方法了,不需要寫出遞迴到方法。當熟練後,繼續用遞迴的方式思考問題,只不過是在腦中將其轉化為動態規劃,這道題就是例子。只不過我只寫出了n2的,對我來說我已經挺滿意了,畢竟我本地測試後oj一次性通過 阿,我知道了,他們到空間複雜的n是指每次只儲存上一行的值,還有人更雞賊...
120 三角形最小路徑和
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3 4 6,5 7 4,1 8,3 自頂向下的最小路徑和為 11 即,2 3 5 1 11 說明 如果你可以只使用 o n 的額外空間 n 為三角形的總行數 來解決這個問題,那麼你的演算法會很加分。...
120 三角形最小路徑和
120.三角形最小路徑和 給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為11 即,2 3 5 1 11 說明 如果你可以只使用 o n 的額外空間 n 為三角形的總行數 來解決這個問題,...