设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。
push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 getMin()–得到栈中最小元素 数据范围 操作命令总数 [0,100]
。
样例 1 2 3 4 5 6 7 8 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 class MinStack { public : int stk[100010 ]; int stk_min[100010 ]; int tt; int tt_min; MinStack () { tt = 0 ; tt_min = 0 ; } void push (int x) { stk[++tt] = x; if (!tt_min || x <= stk_min[tt_min]) { stk_min[++tt_min] = x; } } void pop () { if (stk[tt] == stk_min[tt_min]) { tt_min--; } tt--; } int top () { return stk[tt]; } int getMin () { return stk_min[tt_min]; } };
代码实现2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 class MinStack {public : stack<int > stackValue; stack<int > stackMin; MinStack () { } void push (int x) { stackValue.push (x); if (stackMin.empty () || x <= stackMin.top ()) stackMin.push (x); } void pop () { if (stackMin.top () == stackValue.top ()) stackMin.pop (); stackValue.pop (); } int top () { return stackValue.top (); } int getMin () { return stackMin.top (); } };