定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。
在該棧中,呼叫min、push及pop的時間複雜度都是o(1).
push和pop本來都是o(1),這個不需要擔心,但是獲取最小值的話,
如果在棧裡新增乙個成員變數存放最小的元素。每次壓入乙個新元素進棧的時候,如果該元素比當前最小的元素還要小,則更新最小元素。
但是如果當前最小的元素被彈出棧了,如何得到下乙個最小的元素呢?
分析到這裡,我們發現僅僅新增乙個成員變數存放最小元素是不夠的,僅僅乙個變數不夠,也需要乙個集合型別來存放這個最小元素組成的一組資料 , 也就是說當最小元素被彈出棧的時候,我們希望能夠得到次小元素。因此在壓入這個最小元素之前,我們要把次小元素儲存起來。
儲存舊值,儲存歷史值, 是不是可以想到又是乙個棧結構, 把每次的最小元素(之前的最小元素和新壓入棧的元素兩者的較小值)都儲存起來放到另外乙個輔助棧.
好,來試一試. 這個新的結構內部有2個棧, 乙個主棧,乙個輔助棧.
當push的時候,主棧正常push此元素, 輔助棧push 輔助棧頂和此元素中的較小值,
當pop的時候, 主棧pop棧頂, 輔助棧也pop出棧頂元素,
當min的時候, 返回輔助棧的棧頂元素.
來個例子,
push(3),主棧和輔助棧棧頂都是3,
push(5),主棧棧頂放入5,輔助棧放入 輔助棧頂3和5的較小值 , 還是3,
push(7),主棧棧頂放入7,輔助棧放入 輔助棧頂3和7的較小值 , 還是3,
push(1),主棧棧頂放入1,輔助棧放入 輔助棧頂3和1的較小值 , 放入1,
....
當pop的時候, 主棧和輔助棧都執行pop,
...當min的時候, 返回輔助棧的棧頂元素.
到此, 思路就完成了. **量不大, 但是思路很巧妙.
#import @inte***ce minstack : nsobject
- (void)push:(int)data;
- (int)pop;
- (int)min;
@end
-------------
#import "minstack.h"
@inte***ce minstack ()
@property (nonatomic, strong) nsmutablearray*dataarray;
@property (nonatomic, strong) nsmutablearray*minarray;
@end
@implementation minstack
- (instancetype)init
return self;
}// 主棧進行正常的push, 輔助棧棧push乙個當前的最小值
- (void)push:(int)data
[self.minarray addobject:@(minvalue)];
}- (int)pop
nsnumber * popnum = self.dataarray.lastobject;
[self.dataarray removelastobject];
[self.minarray removelastobject];
return popnum.intvalue;
}- (int)min
nslog(@"當前最小值是 %@",self.minarray.lastobject);
return self.minarray.lastobject.intvalue;
}@end
棧的最小值查詢(O1)
對棧增加乙個獲取最小值的方法 getmin 要求,時間複雜度為o 1 定義乙個minindex,儲存最小值的下標。每次push的時候比較大小,如果小於最小值,則minindex修改為當前下標,否則不修改。這樣貌似可以,但是發現乙個嚴重的問題,如果pop操作,把最小值出棧後,minindex就無效了。...
O 1 時間求出棧內元素最小值
問題描述 對現在的stack 棧 資料結構進行改進,加乙個min 功能,使之能在常數,即o 1 時間內給出棧中的最小值。可對push 和pop 函式進行修改,但要求其時間複雜度都只能是o 1 解決方案 在棧的每個元素加乙個屬性值 min 用於記錄當前位置下面的元素的最小值 元素的值用key表示 壓棧...
O 1 複雜度求乙個棧的最小值
要求乙個棧的最小值,第一反應肯定是乙個個出棧,那樣太蠢了,如何更優呢?第乙個思路就是自己定義乙個指標,始終指向儲存了最小值的那個節點不就行了。看似正確,但是當你最小值的那個節點出棧了,那麼如何找到下乙個最小值呢?因此,我們需要乙個資料結構來儲存每乙個狀態下的最小值。即我們應當知道每當棧中插入乙個新元...