劍指Offer 包含min函式的棧

2021-10-05 05:27:56 字數 1166 閱讀 2124

定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的 min 函式在該棧中,呼叫 min、push 及 pop 的時間複雜度都是 o(1)。

示例:minstack minstack = new minstack();

minstack.push(-2);

minstack.push(0);

minstack.push(-3);

minstack.min();   --> 返回 -3.

minstack.pop();

minstack.top();      --> 返回 0.

minstack.min();   --> 返回 -2.

各函式的呼叫總次數不超過 20000 次

最一開始想著每次在push的時候直接更新下最小值就行了,沒想到pop的情況。。

為了實現時間複雜度是o(1),可以採用儲存的時候存的不是實際值,而是實際值與最小值的差值。

但是這種**我沒寫出來,換思路

除了乙個常規列表實現棧的操作外,再開乙個輔助棧用於儲存當前的最小資訊:

入棧操作:當輔助棧為空或者新元素小於等於輔助棧頂元素時,輔助棧入棧;否則無視

出棧操作:當常規棧中待出棧的元素等於輔助棧頂元素時,輔助棧出棧乙個元素,代表當前的最小值出隊或者次數減1

棧頂操作:僅需從常規棧頂取元素即可

最小值操作:因為輔助棧中維護的都是當前狀態下的最小值,所以從輔助棧頂取元素即可

另外,利用and的短路特性實現對兩個棧非空判斷,確保操作的穩健性。

class minstack 

void push(int x)

sta.push(x);

}void pop()

sta.pop();

}int top()

int min()

};/**

* your minstack object will be instantiated and called as such:

* minstack* obj = new minstack();

* obj->push(x);

* obj->pop();

* int param_3 = obj->top();

* int param_4 = obj->min();

*/

劍指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 ...