要求乙個棧的最小值,第一反應肯定是乙個個出棧,那樣太蠢了,如何更優呢?
第乙個思路就是自己定義乙個指標,始終指向儲存了最小值的那個節點不就行了。看似正確,但是當你最小值的那個節點出棧了,那麼如何找到下乙個最小值呢?
因此,我們需要乙個資料結構來儲存每乙個狀態下的最小值。即我們應當知道每當棧中插入乙個新元素後的最小值位置,也應當知道每當棧中刪除乙個元素後的最小值的位置。
做法很簡單,用另乙個棧來記錄每乙個狀態下的最小值的位置即可!
我們假設原來的那個棧叫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...