题目描述
题干:
设计一个支持 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,虽然不支持索引,但是线程是安全的,这也是用的比较多的例子
文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见