leetcode.最小棧問題

設計一個支持 push,pop,top 操做,並能在常數時間內檢索到最小元素的棧。bash

  • push(x) -- 將元素 x 推入棧中。
  • pop() -- 刪除棧頂的元素。
  • top() -- 獲取棧頂元素。
  • getMin() -- 檢索棧中的最小元素。

示例:
ui

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.複製代碼

剛看到題目。。本身第一個想法是要不要開一個鏈表慢慢比較棧中數據的大小。。後來百度一下,看到了正確思路。spa

首先開兩個棧,一個棧a(放元素x),一個棧b(放最小值)。每當有元素x進棧時,元素x先跟棧b的棧頂比較,若是元素x比棧頂元素小,元素x入棧a、b;若是元素x大於棧頂元素,元素x入棧a。出棧時,出棧元素跟棧b的棧頂比較,若是出棧元素與棧b棧頂相等,棧b.pop()。這種方法可以避免,若是當前棧的最小值出棧時,就沒法找到棧的最小值。設計

代碼實現:code

鏈表實現:rem

class MinStack {
    private List<Integer> data;
    private List<Integer> min;
    /** initialize your data structure here. */
    public MinStack() {
        data = new ArrayList<>();
        min = new ArrayList<>();
    }
    
    public void push(int x) {
        if(data.isEmpty() || x <= min.get(min.size()-1)) {
            min.add(x);
        }
        data.add(x);
    }
    
    public void pop() {
        if(data.get(data.size()-1).equals(min.get(min.size()-1))){
            min.remove(min.size()-1);
        }
        data.remove(data.size()-1);
    }
    
    public int top() {
        return data.get(data.size()-1);
    }
    
    public int getMin() {
        return min.get(min.size()-1);
    }
}複製代碼

棧實現:get

class MinStack {
    private Stack<Integer> data;
    private Stack<Integer> min;
    /** initialize your data structure here. */
    public MinStack() {
        data = new Stack();
        min = new Stack();
    }
    
    public void push(int x) {
        if(data.isEmpty() || x <= min.peek()) {
            min.push(x);
        }
        data.push(x);
    }
    
    public void pop() {
        if(data.peek().equals(min.peek())){
            min.pop();
        }
        data.pop();
    }
    
    public int top() {
        return data.peek();
    }
    
    public int getMin() {
        return min.peek();
    }
}
複製代碼
相關文章
相關標籤/搜索