题目描述
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) – 将元素 x 推入栈中。
- pop() – 删除栈顶的元素。
- top() – 获取栈顶元素。
- getMin() – 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
题解
思路似乎有很多,贴两个常用的。第一个就是比较好理解,用空间换时间,再准备一个栈存储最小值。第二个只用一个栈。
两个栈(java)
思路:思路可以直接点小标题,原楼主的图解很清晰。原则就是最小栈只存储更小的元素,当需要出栈时,最小元素也必然比次小元素更靠近栈顶。
class MinStack {
/** initialize your data structure here. */
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
stack.push(x);
if (!minStack.isEmpty()) {
int top = minStack.peek();
//小于栈顶元素时入栈
if (x <= top) {
minStack.push(x);
}
}else{
minStack.push(x);
}
}
public void pop() {
int pop = stack.pop();
int top = minStack.peek();
//stack里栈顶元素和minstack栈顶元素相同时再出栈
if (pop == top) {
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
复杂度分析
单栈法(java)
思路:只用一个变量保存最小值。
class MinStack {
int min = Integer.MAX_VALUE; // 严谨
Stack<Integer> stack = new Stack<Integer>();
public void push(int x) {
// 如果push的值比现有最小值小,则先把旧值压入,然后再压新值。
//同时更新变量。
if(x <= min){
stack.push(min);
min=x;
}
stack.push(x);
}
public void pop() {
//如果pop出的数和最小值相等,则把之前多压的旧值复原。
if(stack.pop() == min) min=stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return min;
}
}