在O 1 找到棧中的最小值

2021-10-07 15:35:50 字數 1871 閱讀 2404

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

要求乙個棧的最小值,第一反應肯定是乙個個出棧,那樣太蠢了,如何更優呢?第乙個思路就是自己定義乙個指標,始終指向儲存了最小值的那個節點不就行了。看似正確,但是當你最小值的那個節點出棧了,那麼如何找到下乙個最小值呢?因此,我們需要乙個資料結構來儲存每乙個狀態下的最小值。即我們應當知道每當棧中插入乙個新元...