給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
例如,給定三角形:
[[2
],[3
,4],
[6,5
,7],
[4,1
,8,3
]]
自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。
說明:
如果你可以只使用 o(n) 的額外空間(n 為三角形的總行數)來解決這個問題,那麼你的演算法會很加分。
從上到下依次計算每一行每個點的最小路徑總和,並把該最小值覆蓋到該點。計算結束後,最後一行的最小值即為最終的最小路徑和。
以上面的例子為例:
首先看第二行,第乙個點3
,從頂點2
到當前點,只有一種可能2 + 3 = 5
,把3
修改為5
,同理2
到第二行第二個點4
也只有一種路徑,2 + 4 = 6
,把4
修改為6
,得到如下結果:
[[2
],[5
,6],
[6,5
,7],
[4,1
,8,3
]]
然後再看頂點到第三行的3個點最小路徑分別是多少,因為上一行的計算結果已經包含了前面的最短路徑資訊,所以原來的2
到第三行6
的最短路徑和,就等價於現在第二行的5
到第三行6
的最短路徑和(第二行的6
到不了第三行的6
)。頂點到第三行5
等價於第二行5
或6
到第三行5
的最小路徑和。······
下面直接給出每更新一行的結果:
第三行更新:
[[2
],[5
,6],
[11,10
,13],
[4,1
,8,3
]]
第四行更新:
[[2
],[5
,6],
[11,10
,13],
[15,11
,18,16
]]
然後取出最後一行的最小值11
,就是總的最小路徑和。
class
solution
else
if(j >
0&& j < rowsize -1)
else
if(j == rowsize -1)
int newvalue = ********.
get(i)
.get
(j)+ last;
// 獲取當前位置元素值
if(i == ********.
size()
-1)}
else}}
return mintotal;
}}
下面是提交記錄裡面copy過來的(自行新增了一點注釋):
class
solution
public
inthelper
(int level,
int column,list
> ********)
if(level==row-1)
int left=
helper
(level+
1,column,********)
;// 下一行的左邊數值
int right=
helper
(level+
1,column+
1,********)
;// 下一行的右邊數值
// 計算當前位置自底向上的最小值
return memo[level]
[column]
=math.
min(left, right)
+********.
get(level)
.get
(column);}
}
用到了自底向上的動態規劃和遞迴。
如有不當之處,歡迎讀者批評指正!
120 三角形最小路徑和
我現在知道怎麼結合遞迴和動態規劃的方法了,不需要寫出遞迴到方法。當熟練後,繼續用遞迴的方式思考問題,只不過是在腦中將其轉化為動態規劃,這道題就是例子。只不過我只寫出了n2的,對我來說我已經挺滿意了,畢竟我本地測試後oj一次性通過 阿,我知道了,他們到空間複雜的n是指每次只儲存上一行的值,還有人更雞賊...
120 三角形最小路徑和
120.三角形最小路徑和 給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為11 即,2 3 5 1 11 說明 如果你可以只使用 o n 的額外空間 n 為三角形的總行數 來解決這個問題,...
120 三角形最小路徑和
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 1 的兩個結點。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為 11 即,2 3 5 1 11 說明 如...