设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
思路:
若栈中元素为 b c d,a进栈,则只要a在栈中,b c d 就一定在栈中(a出栈之前,b c d 一定不会出栈),因此,a为栈顶一定对应一个最小元素
利用辅助栈,将元素栈同步插入与删除,用于存储与每个元素对应的最小值:
- 栈顶存储栈内最小元素
- 新元素入栈时,将当前辅助栈的栈顶存储的最小值 与 当前元素进行比较,从而更新栈顶最小值
public class MinStack {
Stack<int> stack;
Stack<int> minStack;
public MinStack() {
stack = new Stack<int>();
minStack = new Stack<int>();
}
public void Push(int val) {
stack.Push(val);
if (minStack.Count > 0 && val > minStack.Peek()) {
minStack.Push(minStack.Peek());
}
else
minStack.Push(val);
}
public void Pop() {
stack.Pop();
minStack.Pop();
}
public int Top() {
return stack.Peek();
}
public int GetMin() {
return minStack.Peek();
}
}
复杂度分析
- 时间复杂度:构造方法和每一项操作的时间复杂度都是 O(1)。
- 空间复杂度:O(n),其中 n 是元素个数。空间复杂度主要取决于栈空间,常规栈和最小元素栈的空间都是 O(n)。