題目描述給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。
例如,給定三角形:
[ [2],
[3,4],
[6,5,7],
[4,1,8,3]
]自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。
說明:如果你可以只使用 o(n) 的額外空間(n 為三角形的總行數)來解決這個問題,那麼你的演算法會很加分。
自上而下
子狀態定義:
path[i][j] 表示從頂層到第i層的第j個節點的路徑最小路徑和
轉移函式:
path[i][j] = min(path[i - 1][j], path[i - 1][j - 1]) + ********[i][j]
考慮邊界情況,,即j == 0 時,path[i][0] 只能由path[i - 1][0] 轉移而來;
而當j == i時,path[i][j] 只能1由path[i - 1][i - 1]轉移而來。
自下而上:
從倒數第二層開始,修改原陣列,狀態轉移函式為:
********[i - 1][j] += min(********[i][j], ********[i][j + 1])
class solution:
def minimumtotal(self, ********: list[list[int]]) -> int:
# 自上而下
# n = len(********)
# path = [[0] * n for _ in range(n)]
# path[0][0] = ********[0][0]
# for i in range(1, n):
# path[i][0] = path[i - 1][0] + ********[i][0]
# for j in range(1, i):
# path[i][j] = min(path[i - 1][j], path[i - 1][j - 1]) + ********[i][j]
# path[i][i] = path[i - 1][i - 1] + ********[i][i]
# return min(path[n - 1])
# 自下而上
for i in range(len(********) - 1, 0, -1):
for j in range(i):
********[i - 1][j] += min(********[i][j], ********[i][j + 1])
return ********[0][0]
leetcode 三角形最小路徑
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為11 即,2 3 5 1 11 2 5,6 11,10,13 15,11,18,16 可以看出,將最後乙個陣列的最小值選出來即可,因為最底層...
leetcode 三角形最小路徑和
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為 11 即,2 3 5 1 11 說明 如果你可以只使用 o n 的額外空間 n 為三角形的總行數 來解決這個問題,那麼你的演算法會很加分。...
LeetCode 三角形最小路徑和
比較直觀的想法是,使用乙個陣列來儲存每次計算路徑的最小值,這樣順序遍歷下來,最後求一遍這個陣列的最小元素就是最短路徑的值 初步認為是上面的演算法一方面最後找最小值要重新遍歷一遍,另一方面在每層遍歷時都要new乙個陣列比較佔空間 試著把最小值的計算放在迴圈裡,也沒減少耗時,說明耗時的原因不是計算最小值...