题目描述:
设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。
- push(x)–将元素x插入栈中
- pop()–移除栈顶元素
- top()–得到栈顶元素
- getMin()–得到栈中最小元素
样例
MinStack minStack = new MinStack();
minStack.push(-1);
minStack.push(3);
minStack.push(-4);
minStack.getMin(); --> Returns -4.
minStack.pop();
minStack.top(); --> Returns 3.
minStack.getMin(); --> Returns -1.
分析:
本题考察单调栈。
牺牲空间换时间,为了能在O(1)时间内完成各种操作,设置一个辅助栈mi,该栈中所有元素从栈底到栈顶大小递减。
如何做到实现单调栈mi,mi为空时,直接压入;mi非空,新入栈的元素小于栈顶元素,同样压入。当然栈s的操作不用改变,在出栈时,若两个栈栈顶元素相同,则均要出栈;求最小值,mi栈栈顶元素即是最小值。
class MinStack {
public:
/** initialize your data structure here. */
stack<int> s;
stack<int> mi;
MinStack() {
}
void push(int x) {
s.push(x);
if(mi.empty() || x <= mi.top()) mi.push(x);
}
void pop() {
if(s.top() == mi.top()) mi.pop();
s.pop();
}
int top() {
return s.top();
}
int getMin() {
return mi.top();
}
};