1.题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int 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.
2.解题思路
本题关键字:常数时间
本题难点:int getMin() 获取堆栈中的最小元素。
要完成在常数时间里找到栈中的最小元素,需要这个最小元素总是在栈的顶部,但此时,push(),pop(),top()又不能获取正确的值。
所以本题采用以空间换时间的做法,用两个栈完成这些操作。其中一个栈正常的入栈,出栈,查询栈顶元素。另一个栈在入栈时则只入最小元素。
1.当栈为空时,直接入栈一个元素;
2.栈不为空时,若入栈元素比栈顶元素小,直接入栈,若入栈元素比栈顶元素大,则再入栈一次栈顶元素。(此步骤是为了与第一个栈操作同步)
代码展示:
class MinStack {
private Stack<Integer>s1;
private Stack<Integer>s2;
public MinStack() {
s1=new Stack<>();
s2=new Stack<>();
}
public void push(int val) {
s1.push(val);
if(s2.isEmpty()){
s2.push(val);
}else{
int temp=s2.peek();
if(val<temp){
s2.push(val);
}else{
s2.push(temp);
}
}
}
public void pop() {
s1.pop();
s2.pop();
}
public int top() {
return s1.peek();
}
public int getMin() {
return s2.peek();
}
}