1. 程式人生 > >LeetCode 155.Min Stack

LeetCode 155.Min Stack

也就是說,要用O(1)的複雜度拿到任意時刻的棧中的最小值,那麼自然就不可能去遍歷

所以,有這麼一種巧妙的方法,申請兩個棧,一個是原資料棧,一個是min_stack,min_stack中的棧頂始終存放的是當前資料棧的最小值,也就是說min棧和data棧的資料量是同時增加,同時減少的。

data棧放一個數時,min棧的棧頂和這個數進行比較,如果min棧棧頂比較小,那麼把min棧棧頂再push一次,如果新數x比較小,把min_stack.push()

java程式碼

class MinStack {
    Stack <Integer> data_stack;
    Stack <Integer> min_stack ;
    /** initialize your data structure here. */
    public MinStack() {
        data_stack =new Stack<Integer>();
        min_stack=new Stack<Integer>();
    }
    
    public void push(int x) {
        data_stack.push(x);
        if(min_stack.empty()){
            min_stack.push(x);
        }
        else{
            int min_current=min_stack.peek();
            if(min_current<x){
                min_stack.push(min_current);
            }
            else{
                min_stack.push(x);
            }
        }
    }
    
    public void pop() {
        if(!data_stack.empty()){
            data_stack.pop();
            min_stack.pop();
        } 
    }
    
    public int top() {
        int tmp=0;
        if(!data_stack.empty()){
            tmp=data_stack.peek();
        }
        return tmp;
    }
    
    public int getMin() {
        int tmp=0;
        if(!min_stack.empty()){
            tmp=min_stack.peek();
        }
        return tmp;
    }
}

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