設計一個支持 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
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