Min Stack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) – Push element x onto stack.
- pop() – Removes the element on top of the stack.
- top() – Get the top element.
- getMin() – Retrieve the minimum element in the stack.
思路:
O(1)的方法:用两个stack来模拟。
- s1正常压栈、出栈。
- s2用来记录最小值,栈顶表示当前的最小值。如果压栈的x 大于等于 s2的栈顶,压x入栈s2。如果s1出栈时的栈顶等于s2的栈顶,s2执行pop。
至于复杂度为什么是O(1),因为每次压栈、出栈操作都不带循环、递归。
另:这是我大二数据结构课的期末机试题之一,当时就没想到这种方法。当时是用multiset来当做s2的,每次push和pop都是O(logn)的,所以超时了。
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
s1.push(x);
if(s2.empty()){
s2.push(x);
} else if(s2.top() >= x){
s2.push(x);
}
}
void pop() {
if(!s1.empty()){
if(s1.top() == s2.top()){
s2.pop();
}
s1.pop();
}
}
int top() {
if(!s1.empty())
return s1.top();
return -1;
}
int getMin() {
if(!s2.empty()){
return s2.top();
} return -1;
}
private:
stack<int> s1, s2;
};