劍指offer 包含min函式的棧

2021-10-02 08:08:18 字數 1258 閱讀 7399

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式(時間複雜度應為o(1))。

首先用乙個stl標準棧儲存數值,記為數值棧。

再用乙個stl標準棧儲存最小值,記為最小值棧。注意:

class

solution

void

pop(

)int

top(

)int

min()}

;

竟有時空複雜度均為o(1)的解法,真真膜拜。

原理是資料冗餘,即當前資料中已經包含了前面資料的最小值,舉個例子。

入棧順序

topmin

diff關係4

440=4-4

4=4+(0)55

41=5-4

5=4+(1)66

42=6-4

6=4+(2)33

3-1=3-4

3=4+(-1)22

2-1=2-3

2=3+(-1)11

1-1=1-2

1=2+(-1)

如表,假設我們儲存了當前的最小值、棧頂值以及diff,那麼我們就可以推出以前的所有最小值和棧頂值。

入棧:

壓縮:將要入棧的元素value減去當前最小值min,得到乙個差值diff,只儲存該差值;

更新:如果入棧的元素value比當前最小值min小,則要更新最小值:min=value;

初始:第一次入棧比較特殊,因為此時的min變數並沒有值,所以令:min=value;

top:top當然設定為value;

出棧:

更新:如果棧中儲存的差值diff是負數,說明出棧的元素是當前最小值min,需要把min值更新為上乙個最小值min = min - diff,否則,出棧的元素不是最小值,則不對min變數做任何操作;

還原:如果棧中儲存的差值diff是正數,說明 top = min + diff,否則,說明top元素本身是最小值 top = min;

順序:先更新min,再利用min更新top;

class

solution

void

pop()}

inttop()

intmin()

};

(1)壓縮還原法(資料冗餘)。

劍指offer 包含min函式的棧

一 問題描述 二 思路 兩個棧,乙個當前棧data,乙個輔助棧m min,輔助棧用來儲存當前的最小值,如果出棧,輔助棧也出棧,棧頂元素始終是當前的最小值。在入棧時,如果輔助棧為空或者當前值小於輔助棧棧頂元素,則將當前值加入輔助棧 否則將輔助棧的棧頂元素加入輔助棧,表明此次有大於min棧頂數字入棧。以...

劍指offer 包含min函式的棧

題目描述 定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。這個題要求時間複雜度是o 1 竟然想了好久沒想出來,原來思維定式了,一直在想既然要從小到大排序怎麼可能實現o 1 呢 其實由於出棧入棧是由順序的,用來記錄最小值的棧也不用完整記錄所有元素的順序,只要根據入棧的順序來就行 ...

劍指offer 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。思路 這裡,定義兩個棧,stack和min stack,其中,min stack的最後乙個數永遠保持是stack中最小的乙個數。具體的,在puch時,只儲存比當前最小的還要小的數。pop時,如果stack最小的數pop出,min ...