设计一个支持 push,pop,top 操做,并能在常数时间内检索到最小元素的栈。golang
示例:数据结构
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
复制代码
解法:app
大概思路是使用维护两个栈,一个保存数据,一个保存最小值的索引。ui
type MinStack struct {
data []interface{}
minIndex []int
}
/** initialize your data structure here. */
func Constructor() MinStack {
var instance MinStack
return instance
}
func (this *MinStack) Push(x int) {
this.data = append(this.data, x)
if len(this.minIndex) == 0 {
this.minIndex = append(this.minIndex, 0)
} else {
//当前最小值比新值大
if this.data[this.minIndex[len(this.minIndex) - 1]].(int) > x {
//当前最小值索引压入minIndex
this.minIndex = append(this.minIndex, len(this.data) - 1)
}
}
}
func (this *MinStack) Pop() {
length := len(this.data)
currentMinIndex := length - 1
if currentMinIndex == this.minIndex[len(this.minIndex) - 1] {
this.minIndex = this.minIndex[:len(this.minIndex) - 1]
}
this.data = this.data[:len(this.data) - 1]
}
func (this *MinStack) Top() int {
return this.data[len(this.data) - 1].(int)
}
func (this *MinStack) GetMin() int {
return this.data[this.minIndex[len(this.minIndex) - 1]].(int)
}
/** * Your MinStack object will be instantiated and called as such: * obj := Constructor(); * obj.Push(x); * obj.Pop(); * param_3 := obj.Top(); * param_4 := obj.GetMin(); */
复制代码
参考this