题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
思路
辅助栈的思想:
使用两个栈,在每个元素入栈的时候,在另一个辅助栈中存储当前元素栈内的最小值
即使用一个辅助栈,与元素栈同步插入和删除,用于存储与每个元素的对应的最小值
- 当一个元素要入栈时,取当前辅助栈的栈顶元素(也就是存储的目前元素栈内的最小值),来即将入元素栈的元素进行对比,得出最小值,并插入辅助栈中
- 当一个元素要出栈时,把辅助栈的栈顶元素也一同弹出
- 在任意时刻,元素栈内元素的最小值就存储在辅助栈的栈顶元素中
java代码如下:
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();
}
}
——另外,如果不允许开辟额外空间的话,可以对辅助栈的思想进行改进:
即可以在一个栈中同时保存当前值和最小值。
可以用一个栈,同时保存入栈的值和入栈后的栈内最小值,即每次新元素x入栈时,保存的是一个元组:(当前值x,栈内最小值min),原值作为一个整体,同时出栈和入栈,即栈顶元素同时包含了当前值和栈内最小值
对于top()函数:获取栈顶元组的第一个值
对于getyMin()函数:获取栈顶元组的第二个值
对于pop()函数:删除栈顶的元组
每次元素入栈的时候,比较当前新插入的元素x和当前栈内最小值(即栈顶元组的第二个值)的大小
入栈:当栈为空,保存元素(x,x),当栈非空,保存元组(x,min(栈内最小值,x))
出栈:删除栈顶元组
java代码如下:
class MinStack {
// 数组栈, [当前值, 当前最小值]
private Stack<int[]> stack = new Stack<>();
public MinStack(){}
public void push(int x){
if(stack.isEmpty()){
stack.push(new int[]{x,x});
} else {
stack.push(new int[]{x,Math.min(x,stack.peek()[1])});
}
}
public void pop(){
stack.pop();
}
public int top(){
return stack.peek()[0];
}
public int getMin(){
return stack.peek()[1];
}
}