https://ac.nowcoder.com/acm/problem/3707
题目描述
设计一个支持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.
算法1
(双栈)
我们定义两个栈,一个是正常的栈stk1,另一个是stk2,stk2的栈顶表示当前stk1从栈顶到栈底元素中的最小值
正常的push pop get_top操作由stk1完成
get_min由stk2完成
如何维护stk2
每次进行push操作时,将新加入的元素x与stk2栈顶元素进行比较如果x更小则在stk2中push一个x,否则push一个stk2的栈顶元素
pop操作stk1和stk2同时进行
(实际操作的时候只需要将小于等于stk2.top()的元素push到stk2。如果当前pop的元素和stk2.top()元素相同则stk2.pop()
时间复杂度
C++ 代码
class Solution { public: stack<int> stk1; stack<int> stk2; Solution() { } void push(int value) { stk1.push(value); if(stk2.empty() || stk2.top() >= value) stk2.push(value); } void pop() { if(stk2.top() == stk1.top()) stk2.pop(); stk1.pop(); } int top() { return stk1.top(); } int min() { return stk2.top(); } };