维护两个栈:
- s 正常栈,以切片尾部作为栈顶数据进出
- min 单调递减栈,以切片尾部作为栈顶数据进出,栈顶元素是当前最小值,入栈新数据 x,取 x 和当前栈顶元素二者中更小的值实际入栈
type MinStack struct {
s []int
min []int
}
func Constructor() MinStack {
return MinStack{}
}
func (t *MinStack) Push(x int) {
t.s = append(t.s, x)
if len(t.min) == 0 {
t.min = append(t.min, x)
} else {
min := x
if t.min[len(t.min)-1] < x {
min = t.min[len(t.min)-1]
}
t.min = append(t.min, min)
}
}
func (t *MinStack) Pop() {
t.s = t.s[:len(t.s)-1]
t.min = t.min[:len(t.min)-1]
}
func (t *MinStack) Top() int {
return t.s[len(t.s)-1]
}
func (t *MinStack) Min() int {
return t.min[len(t.min)-1]
}