设计一个支持
push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。实现
MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。示例 1:
输入: ["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.提示:
-231 <= val <= 231 - 1
pop
、top
和getMin
操作总是在 非空栈 上调用push
,pop
,top
, andgetMin
最多被调用3 * 104
次
思路:
- push():
- 若 "当前值val比辅助栈最小值" 小的话,那往辅助栈中push 当前值val
- 若 "当前值val比辅助栈最小值" 大的话,那继续往辅助栈中push “辅助栈当前同样的最小值”
- 否则数据栈和辅助栈元素个数不等,每次数据栈和辅助栈同时进行pop()操作时会出错
- pop():
- 数据栈和辅助栈同时pop()
时间复杂度:O(1)
空间复杂度:O(n)
type MinStack struct {
stack []int // 数据栈
minStack []int // 辅助栈:栈顶为当前最小值
}
func Constructor() MinStack {
// return MinStack{
// stack: make([]int, 0),
// minStack: []int{math.MaxInt64},
// }
return MinStack{}
}
func (this *MinStack) Push(val int) {
this.stack = append(this.stack, val)
// 若 "当前值val比辅助栈最小值" 大的话,那继续往辅助栈中push “辅助栈当前同样的最小值”
if len(this.minStack) > 0 && val > this.GetMin() {
this.minStack = append(this.minStack, this.GetMin())
// 否则直接添加val即可
} else {
this.minStack = append(this.minStack, val)
}
}
func (this *MinStack) Pop() {
this.stack = this.stack[:len(this.stack)-1]
this.minStack = this.minStack[:len(this.minStack)-1]
}
func (this *MinStack) Top() int {
return this.stack[len(this.stack)-1]
}
func (this *MinStack) GetMin() int {
return this.minStack[len(this.minStack)-1]
}
/**
* Your MinStack object will be instantiated and called as such:
* obj := Constructor();
* obj.Push(val);
* obj.Pop();
* param_3 := obj.Top();
* param_4 := obj.GetMin();
*/