[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.

实现一个栈的基本功能,外加一个获得最小元素的操作。
正常情况下top,pop和push操作都是常量时间的,而主要问题就在于这个getMin上面,如果遍历一遍去找最小值,那么getMin操作就是O(n)的,既然出出来了这道题就肯定不是这么简单的哈。
比较容易想到就是要追溯这个最小值,在push的时候维护最小值,但是如果pop出最小值的时候该如何处理呢,如何获得第二小的值呢?
如果要去寻找又不是常量时间了。解决的方案是再维护一个栈,我们称为最小栈,如果遇到更小的值则插入最小栈,否则就不需要插入最小栈(注意这里正常栈是怎么都要插进去的)。

class MinStack {  
    ArrayList<Integer> stack = new ArrayList<Integer>();  
    ArrayList<Integer> minStack = new ArrayList<Integer>();  
    public void push(int x) {  
        stack.add(x);  
        if(minStack.isEmpty() || minStack.get(minStack.size()-1)>=x)  
        {  
            minStack.add(x);  
        }  
    }  

    public void pop() {  
        if(stack.isEmpty())  
        {  
            return;  
        }  
        int elem = stack.remove(stack.size()-1);  
        if(!minStack.isEmpty() && elem == minStack.get(minStack.size()-1))  
        {  
            minStack.remove(minStack.size()-1);  
        }  
    }  

    public int top() {  
        if(!stack.isEmpty())  
            return stack.get(stack.size()-1);  
        return 0;  
    }  

    public int getMin() {  
        if(!minStack.isEmpty())  
            return minStack.get(minStack.size()-1);  
        return 0;  
    }  
}  

你可能感兴趣的:(LeetCode)