无关风月

冰冻三尺非一日之寒

LeetCode-155.Min Stack

设计一个支持 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.

分析:
桟可以用数组实现,由于不知道长度 ,用 ArrayList 实现
要求 getMin() 在常数时间内检索到最小元素,每次在 ArrayList 里查找最小元素的话,一定不满足要求;
采用 空间换时间 的方法,另设一个桟 minNums(同样用ArrayList 和一个int 型栈顶指针 实现),记录每次插入后当前最小的元素,这样

  • getMin() 只需返回栈顶元素即可
  • push(int x) 的时候,判断是否小于等于栈顶元素,是的话,放入minNums中;
  • pop() 的时候,判断栈顶元素是否是当前最小元素,即是否等于minNums 栈顶元素,如果是,就也弹出 minNums 栈顶元素,这时 minNums 栈顶元素 就是上一个元素添加前的最小元素。
class MinStack {
    List<Integer> stacklist;
    List<Integer> minNums;
    int a;//栈顶指针
    int b;//最小元素桟顶指针

    /** initialize your data structure here. */
    public MinStack() {
        stacklist=new ArrayList<Integer>();
        minNums=new ArrayList<Integer>();
        a=-1;
        b=-1;
    }

    public void push(int x) {
        a++;
        stacklist.add(x);
        if(b==-1||minNums.get(b)>=x){
            b++;
            minNums.add(x);
        }
    }

    public void pop() {
        int thisremove=(int) stacklist.remove(a);
        a--;
        if(minNums.get(b)==thisremove){
            minNums.remove(b);
            b--;
        }
    }

    public int top() {
        return stacklist.get(a);
    }

    public int getMin() {
        return minNums.get(b);
    }
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxm1306192988/article/details/80352298
文章标签: O(1) 模拟桟
个人分类: OJ
想对作者说点什么? 我来说一句

heap and stack

2011年05月06日 728KB 下载

Stack 的建立,删除及相关操作

2010年12月24日 2KB 下载

Stack Stack的实现

2011年07月10日 1KB 下载

Smashing the Stack

2007年12月16日 369KB 下载

没有更多推荐了,返回首页

不良信息举报

LeetCode-155.Min Stack

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭