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.
Example:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> Returns -3. minStack.pop(); minStack.top(); --> Returns 0. minStack.getMin(); --> Returns -2.
===================================================================
题目链接:https://leetcode.com/problems/min-stack/
题目大意:在普通栈的基础上增加一个getMin()的操作,得到栈中最小的元素。
思路:
1、用两个stack来维护这个结构。1个stack用来正常进行stack的push pop等操作。另外1个stack用来维护min。每次对stack进行pop或者push时,也对min_stack进行相应操作。
2、第2个stack的大小是可以进行优化的。保证每次入栈比当前min小或者相等的值就可以了。pop的时候,比较待pop元素和min_stack的top的大小。如果待pop元素和min_stack top相等,则将min stack进行pop。
算法分析:所有操作都是在常数时间完成的,算法时间复杂度为O(1)。
参考代码:
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
st.clear() ;
minst.clear() ;
}
void push(int x) {
st.push_back ( x ) ;
if ( minst.empty() || x <= minst.back() )
minst.push_back ( x ) ;
}
void pop() {
if ( st.back() == minst.back() )
minst.pop_back() ;
st.pop_back() ;
}
int top() {
return st.back() ;
}
int getMin() {
return minst.back() ;
}
private:
vector <int> st ;
vector <int> minst ;
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/