LeetCode筆記:155. Min Stack

問題:

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • getMin() -- Retrieve the minimum element in the stack.
    Example:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> Returns -3.
minStack.pop();
minStack.top(); --> Returns 0.
minStack.getMin(); --> Returns -2.

大意:

設(shè)計一個棧纪挎,支持push期贫、pop、top以及在固定時間內(nèi)檢索最小元素异袄。

  • push(x) -- 將元素x放入棧中通砍。
  • pop() -- 從棧的頂端移除元素。
  • top() -- 獲取棧頂元素烤蜕。
  • getMin() -- 檢索棧中的最小元素
    例子:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> Returns -3.
minStack.pop();
minStack.top(); --> Returns 0.
minStack.getMin(); --> Returns -2.

思路:

這道題對于棧的操作本身都不難封孙,并不是要用隊列或者別的數(shù)據(jù)結(jié)構(gòu)來模擬一個棧,直接就允許用棧來做讽营。真正難的在于檢索最小元素敛瓷,并且還要再固定時間內(nèi)。

要在入棧以及出棧的同時不停地計算最小元素斑匪,首先棧本身是不支持的呐籽,如果用數(shù)組之類的來記錄,那么每次有新元素進(jìn)來都需要排個序蚀瘸,非常耗時狡蝶。

因此,這種方法巧妙地在每次入棧贮勃、出棧時進(jìn)行簡單的加減操作贪惹,達(dá)到可以直接獲取最小元素的結(jié)果。在入棧時寂嘉,入的不是實(shí)際的元素值奏瞬,而是與當(dāng)前記錄的最小值的差值,如果新入的更小泉孩,就將其設(shè)為最小值硼端,此時就保證了隨時可以獲取最小值。出棧時寓搬,要修改最小值珍昨。獲取棧頂元素時,因為棧中記錄的并不是原始值,所以要與記錄的最小值進(jìn)行操作來還原镣典。

由于題目在submit時會用超過int范圍的大數(shù)來測試兔毙,所以只能用long來操作。

他山之石(Java):

public class MinStack {
    Stack<Long> stack;
    long min;

    /** initialize your data structure here. */
    public MinStack() {
        stack=new Stack<Long>();
    }
    
    public void push(int x) {
        if (stack.isEmpty()) {
            stack.push(0L);
            min = x;
        } else {
            stack.push(x - min);
            if (x < min) min = x;
        }
    }
    
    public void pop() {
        if (stack.isEmpty()) return;
        
        long pop = stack.pop();
        if (pop < 0) min = min - pop;
    }
    
    public int top() {
        long top = stack.peek();
        if (top < 0) return (int)min;
        else return (int)(min + top);
    }
    
    public int getMin() {
        return (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.getMin();
 */

合集:https://github.com/Cloudox/LeetCode-Record


查看作者首頁

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兄春,一起剝皮案震驚了整個濱河市澎剥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赶舆,老刑警劉巖肴裙,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涌乳,居然都是意外死亡蜻懦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門夕晓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宛乃,“玉大人,你說我怎么就攤上這事蒸辆≌髁叮” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵躬贡,是天一觀的道長谆奥。 經(jīng)常有香客問我,道長拂玻,這世上最難降的妖魔是什么酸些? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮檐蚜,結(jié)果婚禮上魄懂,老公的妹妹穿的比我還像新娘。我一直安慰自己闯第,他們只是感情好市栗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咳短,像睡著了一般填帽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咙好,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天篡腌,我揣著相機(jī)與錄音,去河邊找鬼敷扫。 笑死哀蘑,一個胖子當(dāng)著我的面吹牛诚卸,可吹牛的內(nèi)容都是我干的葵第。 我是一名探鬼主播绘迁,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卒密!你這毒婦竟也來了缀台?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哮奇,失蹤者是張志新(化名)和其女友劉穎膛腐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼎俘,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哲身,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贸伐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勘天。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捉邢,靈堂內(nèi)的尸體忽然破棺而出脯丝,到底是詐尸還是另有隱情,我是刑警寧澤伏伐,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布宠进,位于F島的核電站,受9級特大地震影響藐翎,放射性物質(zhì)發(fā)生泄漏材蹬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一吝镣、第九天 我趴在偏房一處隱蔽的房頂上張望赚导。 院中可真熱鬧,春花似錦赤惊、人聲如沸吼旧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圈暗。三九已至,卻和暖如春裕膀,著一層夾襖步出監(jiān)牢的瞬間员串,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工昼扛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寸齐,地道東北人欲诺。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像渺鹦,于是被迫代替她去往敵國和親扰法。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容