定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的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 ...