思路
这道题用到了两个栈来维护,第一个栈就正常的使用,第二个栈用来维护最小值,当新来的值大于第二个栈的top值的话就没必要加进来,因为之后每次取最小值的时候都会返回这个top值,直到pop的时候将这个值弹出。那么这个栈top为最小 top-1的值就是当top不在时候整个栈的最小值以此类推。当pop出的值是top值的时候说明这个栈的最小值不再是这个top值了。如果后续新push的值一直没有小于最小值stack的top,那每次getmin的时候返回的时候就返回top,也就是整个栈的最小值,直到这个值被push了之后,但是top-1又是接下来整个栈的最小值。
代码示例
type MinStack struct {
stack []int
minStack []int
}
func Constructor() MinStack {
return MinStack{
stack:make([]int,0),
minStack:make([]int,0),
}
}
func (this *MinStack) Push(val int) {
this.stack=append(this.stack,val)
if len(this.minStack)==0 || val<=this.minStack[len(this.minStack)-1]{this.minStack=append(this.minStack,val)}
}
func (this *MinStack) Pop() {
if this.stack[len(this.stack)-1]==this.minStack[len(this.minStack)-1]{
this.minStack=this.minStack[:len(this.minStack)-1]
}
this.stack=this.stack[:len(this.stack)-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]
}