3 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以使用O(1)pop(),push()和get_min()實(shí)現(xiàn)堆棧:只需將當(dāng)前最小值與每個(gè)元素一起存儲(chǔ)。因此,例如,堆棧[4,2,5,1]
(頂部的1)變?yōu)?code>[(4,4), (2,2), (5,2), (1,1)]。
然后,您可以使用兩個(gè)堆棧來(lái)實(shí)現(xiàn)隊(duì)列。推到一個(gè)堆棧,從另一個(gè)堆棧彈出; 如果第二個(gè)堆棧在彈出期間為空,則將所有元素從第一個(gè)堆棧移動(dòng)到第二個(gè)堆棧。
例如,對(duì)于pop
請(qǐng)求,從第一個(gè)堆棧移動(dòng)所有元素[(4,4), (2,2), (5,2), (1,1)]
,第二個(gè)堆棧將是[(1,1), (5,1), (2,1), (4,1)]
。現(xiàn)在返回第二個(gè)堆棧的頂部元素。
要查找隊(duì)列的最小元素,請(qǐng)查看各個(gè)最小堆棧的最小兩個(gè)元素,然后取這兩個(gè)值中的最小值。(當(dāng)然,這里有一些額外的邏輯,其中一個(gè)堆棧是空的,但這并不難解決)。
這將有O(1)get_min()
和push()
攤銷O(1) pop()
。
添加回答
舉報(bào)