无关风月

冰冻三尺非一日之寒

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
上一篇棋盘覆盖问题--分治法
下一篇LeetCode-128. Longest Consecutive Sequence
想对作者说点什么? 我来说一句

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 下载

TCG software stack

2010年10月14日 2.78MB 下载

ZigBee Specification and Stack Profile

2017年12月01日 2.99MB 下载

Stack检测括号匹配.zip

2017年03月05日 2KB 下载

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

关闭
关闭