[Leetcode 155] Min Stack (easy)

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.

思路 1: two stacks

通過在class中申明2個stack來分別記錄master stack和min stack

  • Master stack: 正常記錄stack進行push, pop, getMin()等操作后stack的情況
  • Min stack:只有當(dāng)stack為空勒虾,或者當(dāng)前要插入的值 <= min stack.peek()小的時候柱徙,才插入值,這樣就可以保證min stack棧頂?shù)脑赜肋h都是最小的。
原因: 
Master stack:  4  1  2  1
Min stack: 4 1 
(如果只插入比棧頂小的元素嗤朴,那么當(dāng)彈出1 的時候蔑滓,min stack的1將被彈出渊抄,但是此時的最小值其實還是1,但是min stack就已經(jīng)丟失了這個最小值)

Note: 為保證min stack棧頂?shù)脑赜肋h都是最小的晤锥, pop操作時必須要進行一次判斷,判斷pop的這個元素是否= = min stack棧頂?shù)脑? 如果相等廊宪,此時需要同時彈出min stack棧頂?shù)脑亍?/p>

class MinStack {
    Stack<Integer> mainStack = new Stack<Integer>();
    Stack<Integer> minStack = new Stack<Integer>();
    
    /** initialize your data structure here. */
    public MinStack() {
        
    }
    
    public void push(int x) {
        mainStack.push(x);
        if (minStack.isEmpty() || x <= minStack.peek()) {
            minStack.push(x);
            System.out.println("push min");
        }
    }
    
    public void pop() {
        int cur = 0;
        if (!mainStack.isEmpty()) {
            cur = mainStack.pop();
        }
        
        if (!minStack.isEmpty() && cur == minStack.peek()) {
            minStack.pop();
        } 
        
    }
    
    public int top() {
        if (!mainStack.isEmpty()) {
            return mainStack.peek();
        }
        return Integer.MIN_VALUE;
    }
    
    public int getMin() {
        if (!minStack.isEmpty()) {
            return minStack.peek();
        } 
        return Integer.MIN_VALUE;
    }
}

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

Solution2: One Stack for main stack, one priorityQueue for minHeap which keep an ascending number list

class MinStack {
    Stack<Integer> stack;
    PriorityQueue<Integer> minHeap;

    /** initialize your data structure here. */
    public MinStack() {
        stack = new Stack<Integer> ();
        minHeap = new PriorityQueue<Integer> ();
    }
    
    public void push(int x) {
        stack.push (x);
        minHeap.offer (x);
    }
    
    public void pop() {
        int popedNumber = stack.pop ();
        if (minHeap.peek () == popedNumber) {
            minHeap.poll ();
        }
    }
    
    public int top() {
        return stack.peek ();
    }
    
    public int getMin() {
        return minHeap.peek ();
    }
}

/**
 * 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();
 */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矾瘾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子箭启,更是在濱河造成了極大的恐慌壕翩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傅寡,死亡現(xiàn)場離奇詭異放妈,居然都是意外死亡,警方通過查閱死者的電腦和手機荐操,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門芜抒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人托启,你說我怎么就攤上這事宅倒。” “怎么了驾中?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵唉堪,是天一觀的道長。 經(jīng)常有香客問我肩民,道長唠亚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任持痰,我火速辦了婚禮灶搜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己割卖,他們只是感情好前酿,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹏溯,像睡著了一般罢维。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丙挽,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天肺孵,我揣著相機與錄音,去河邊找鬼颜阐。 笑死平窘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凳怨。 我是一名探鬼主播瑰艘,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肤舞!你這毒婦竟也來了紫新?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤萨赁,失蹤者是張志新(化名)和其女友劉穎弊琴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杖爽,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡敲董,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了慰安。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腋寨。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖化焕,靈堂內(nèi)的尸體忽然破棺而出萄窜,到底是詐尸還是另有隱情,我是刑警寧澤撒桨,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布查刻,位于F島的核電站,受9級特大地震影響凤类,放射性物質(zhì)發(fā)生泄漏穗泵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一谜疤、第九天 我趴在偏房一處隱蔽的房頂上張望佃延。 院中可真熱鬧现诀,春花似錦、人聲如沸履肃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尺棋。三九已至封锉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陡鹃,已是汗流浹背烘浦。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工抖坪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萍鲸,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓擦俐,卻偏偏與公主長得像脊阴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚯瞧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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