题目描述:
设计一个支持 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.
题目链接: https://leetcode-cn.com/problems/min-stack/
设计思路:
为了获得最小栈,我们必须维护两个栈,一个栈的放加入进来的元素,另一个为最小栈,如果最小栈为空的时候,直接放进来一个就行,如果要放入的元素比最小栈的栈顶元素大,则继续再放入一个栈顶元素(保持最小),如果放入进来的元素比最小栈的栈顶元素小,则直接放进来就可以,总而言之,只要保持当前最小即可.
删除的时候两个一起移除就可以.
class MinStack {
Stack<Integer> stack ;
Stack<Integer> min ;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack();
min = new Stack();
}
public void push(int val) {
if(min.size() == 0){
min.push(val);
stack.push(val);
return ;
}
if(val > min.peek()){
stack.push(val);
min.push(min.peek());
}else{
min.push(val);
stack.push(val);
}
}
public void pop() {
if(stack.size() == 0){
return;
}
stack.pop();
min.pop();
}
public int top() {
if(stack.size() == 0 ){
return -1;
}
return stack.peek();
}
public int getMin() {
if(min.size() == 0 ){
return -1;
}
return min.peek();
}
}