120 三角形最小路徑和

2021-09-29 11:54:35 字數 2294 閱讀 1010

給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。

例如,給定三角形:

[[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等價於第二行56到第三行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 說明 如...