LeetCode——155. 最小栈

题目描述

题干:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。

示例:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

题解思路

第一次遇到设计题,首先看完题我以为是让我自己实现push、pop和getMin方法,觉得没什么,可是他想让你设计的可不是简单的实现这几个方法就可以了

不能忽略的条件就是常数时间内,其他的pop、top和push还好,可是getMin没有现成的方法可以使用,而且我们常数时间内我们就不能考虑遍历结构体了

所以返回最小值的唯一方法就是保留好最小值,我们可以有很多实现方法,比如说自定义Stack节点或者辅助栈,因为Stack已经过时,不推荐使用

我们这次使用辅助栈的方法,用Linklist来模拟栈,代码如下

正确代码

class MinStack {

    Deque<Integer> stack;
    Deque<Integer> minStack;

    //初始化栈
    public MinStack() {
        stack = new LinkedList<Integer>();
        minStack = new LinkedList<Integer>();
        minStack.push(Integer.MAX_VALUE);
    }
    
    //辅助栈中跟随栈进栈一一对应,不过是进栈的永远是最小值
    public void push(int x) {
        stack.push(x);
        minStack.push(Math.min(minStack.peek(),x));
    }

    public void pop() {
        stack.pop();
        minStack.pop();
    }

    public int top() {
        return stack.peek();

    }

    public int getMin() {
        return minStack.peek();
    }
}

总结

说一下Stack,先进后出的栈结构,继承的Vecter的矢量队列的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表

常用的API有pop、push、peek、empty和search,相信功能你都是熟悉的,就不过多赘述了,至于它和Vecter都被弃用,还是因为线程安全的问题

所以这里我们设计栈的时候用的LinkedList,继承于Queue和Deque,虽然不支持索引,但是线程是安全的,这也是用的比较多的例子

文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见
posted @ 2021-03-13 13:34  21岁还不是架构师  阅读(41)  评论(0编辑  收藏  举报