leetcode.最小棧問題

ahiru?發表於2019-02-19

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

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

示例:

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

剛看到題目。。自己第一個想法是要不要開一個連結串列慢慢比較棧中資料的大小。。後來百度一下,看到了正確思路。

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

程式碼實現:

連結串列實現:

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);
    }
}複製程式碼

棧實現:

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();
    }
}
複製程式碼


相關文章