题目描述 设计一个支持 push, pop, top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素 val
推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。示例 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
提示
$-2 ^ {31} \leq val \leq 2 ^ {31} - 1$ pop, top
和 getMin
操作总是在 非空栈 上调用push, pop, top, getMin
最多被调用 $3 * 10 ^ 4$ 次模拟 - $O(1)$ 栈模拟 如果没有 getMin
函数的话,那么可以利用 一个栈 (记为 stkval
),支持:push, pop, top
操作。
如何实现 getMin
函数呢?
可以维护栈中每个元素以及之前所有加入栈中的元素(也就是当前元素到栈底的所有元素)的最小值。 如何维护这个最小值呢?
记录每次 stkval 栈操作后栈内所有元素的最小值 。由于只需要栈操作,因此我们只需要利用另外一个栈记录这个最小值即可(记为 stkmin
) 对于每个操作两个栈操作:
记此时 stkmin
栈顶元素为 $mv$ push x
:当前元素加入 stkval
中 如果 $x \leq mv$:当前元素加入 stkmin
中,因为本次操作后最小值需要更新为 $x$ pop
:记 stkval
的栈顶元素为 $x$,stkval
弹出 $x$ 如果 $x = mv$,那么弹出 stkmin
栈顶元素 $mv$ top
:输出 stakval
栈顶元素即可getMin
:输出 stkmin
栈顶元素 $mv$ 即可时间复杂度 - $O(1)$ 每一种操作均为栈操作,时间复杂度均为 $O(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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 type MinStack struct { stkval, stkmin []int } func Constructor () MinStack { return MinStack{[]int {}, []int {}} } func (this *MinStack) Push(val int ) { this.stkval = append (this.stkval, val) if len (this.stkmin) == 0 || val <= this.stkmin[len (this.stkmin) - 1 ] { this.stkmin = append (this.stkmin, val) } } func (this *MinStack) Pop() { if this.stkval[len (this.stkval) - 1 ] == this.stkmin[len (this.stkmin) - 1 ] { this.stkmin = this.stkmin[:len (this.stkmin) - 1 ] } this.stkval = this.stkval[:len (this.stkval) - 1 ] } func (this *MinStack) Top() int { return this.stkval[len (this.stkval) - 1 ] } func (this *MinStack) GetMin() int { return this.stkmin[len (this.stkmin) - 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 37 38 class MinStack {public : stack<int > stkval; stack<int > stkmin; MinStack () { } void push (int val) { stkval.push (val); if (stkmin.empty () || stkmin.top () >= val) { stkmin.push (val); } } void pop () { if (stkval.top () == stkmin.top ()) stkmin.pop (); stkval.pop (); } int top () { return stkval.top (); } int getMin () { return stkmin.top (); } };