O 1 複雜度求乙個棧的最小值

2022-09-07 15:51:14 字數 1103 閱讀 5064

要求乙個棧的最小值,第一反應肯定是乙個個出棧,那樣太蠢了,如何更優呢?

第乙個思路就是自己定義乙個指標,始終指向儲存了最小值的那個節點不就行了。看似正確,但是當你最小值的那個節點出棧了,那麼如何找到下乙個最小值呢?

因此,我們需要乙個資料結構來儲存每乙個狀態下的最小值。即我們應當知道每當棧中插入乙個新元素後的最小值位置,也應當知道每當棧中刪除乙個元素後的最小值的位置。

做法很簡單,用另乙個棧來記錄每乙個狀態下的最小值的位置即可!

我們假設原來的那個棧叫stack,用來記錄最小值位置的棧叫minstack,那麼我們要做的就是讓minstack隨著stack的變化而動態變化,stack出棧時,minstack跟著出棧,stack入棧時,minstack跟著入棧。

minstack入棧的是什麼呢?很顯然,是拿stack新入棧的元素和minstack棧頂元素比較大小,如果minstack棧頂元素比stack新入棧元素小,那麼minstack就入棧乙個和原來minstack棧頂元素相同的的元素,否則入棧新入棧的這個元素的指標。

新入棧的元素如果和原來minstack棧頂元素一樣大,那麼入不入棧都行,因為**棧的必定先出棧,不論如何都可以保證一直都能找到最小值。

說了這麼多,想練練手的可以去:

下面放上我的**:

class minstack 

void push(int x)

int origintop = minstack.top();

if(x <= origintop)

else

}void pop()

int top()

int getmin()

};/**

* 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.getmin();

*/

最小棧O 1 空間複雜度實現

設計乙個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。常見的一道題目,很多解答都是兩個棧的做法,這裡提供一下o 1 空間複雜度的做法。使用兩個棧的原因是,我...

棧的最小值查詢(O1)

對棧增加乙個獲取最小值的方法 getmin 要求,時間複雜度為o 1 定義乙個minindex,儲存最小值的下標。每次push的時候比較大小,如果小於最小值,則minindex修改為當前下標,否則不修改。這樣貌似可以,但是發現乙個嚴重的問題,如果pop操作,把最小值出棧後,minindex就無效了。...

如何用O 1 的時間複雜度求棧中最小元素

class stack def init self self.items def empty self return len self.items 0 def size self return len self.items def peek self if not self.empty return...