题目
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。
void push(int val)
将元素val推入堆栈。
void pop()
删除堆栈顶部的元素。
int top()
获取堆栈顶部的元素。
int getMin()
获取堆栈中的最小元素。
示例 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 输入: ["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.
|
提示:
-231 <= val <= 231 - 1
pop
、top
和 getMin
操作总是在
非空栈 上调用
push
, pop
, top
, and
getMin
最多被调用 3 * 104
次
题解
这一题其实大致的思路出来了,同样是Duque
来实现栈;
这里要求常数时间内获得最小值,那我们直接考虑最短的时间O(1)
,怎么做呢?其实很简单,我们用另一个栈,每次保存数据的时候,我们都将目前栈内的最小值保存到那个栈里就好了,然后出栈的时候一起出栈。
具体为:
初始化的时候,minStack
为空,xStack
保存Integer.MAX_VALUE
;然后我们给minStack
入栈的时候,xStack
入栈的数据和xStack
的栈顶数据比一下,入栈那个小的数据;出栈的时候一起出,这样就可以保证栈顶一直都是最小数据,也可以在最短的时间访问到最小数据了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class MinStack { Deque<Integer> xStack; Deque<Integer> minStack;
public MinStack() { xStack = new LinkedList<Integer>(); minStack = new LinkedList<Integer>(); minStack.push(Integer.MAX_VALUE); } public void push(int x) { xStack.push(x); minStack.push(Math.min(minStack.peek(), x)); } public void pop() { xStack.pop(); minStack.pop(); } public int top() { return xStack.peek(); } public int getMin() { return minStack.peek(); } }
|