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(); 执行 new "MinStack" 输入为[] 输出为 null
minStack.push(-2); 执行 push 输入为 [-2] 输出为 null
minStack.push(0); 执行 push 输入为 [0] 输出为 null
minStack.push(-3); 执行 push 输入为 [-3] 输出为 null
minStack.getMin(); --> 返回 -3 执行getMin 输入为 [] 输出为 -3
minStack.pop(); 执行pop 输入为 [] 输出为 null
minStack.top(); --> 返回 0. 执行top 输入为 [] 输出为 0
minStack.getMin(); --> 返回 -2. 执行getMin 输入为 [] 输出为 -2
提示:
pop
、top
和 getMin
操作总是在 非空栈 上调用。
题解:
使用辅助栈
思路:
要做出这道题目,首先要理解栈结构先进后出的性质。
对于栈来说,如果一个元素 a 在入栈时,栈里有其它的元素 b, c, d,那么无论这个栈在之后经历了什么操作,只要 a 在栈中,b, c, d 就一定在栈中,因为在 a 被弹出之前,b, c, d 不会被弹出。
因此,在操作过程中的任意一个时刻,只要栈顶的元素是 a,那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。
那么,我们可以在每个元素 a 入栈时把当前栈的最小值 m 存储起来。在这之后无论何时,如果栈顶元素是 a,我们就可以直接返回存储的最小值 m。
算法
class MinStack {
//Deque(double-ended queue,双端队列)是一种具有队列和栈的性质的数据结构。
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() {
//minStack是始终保持栈顶是最小的栈 弹出栈顶,也就是最小元素
return minStack.peek();
}
}