设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
解法:
大概思路是使用维护两个栈,一个保存数据,一个保存最小值的索引。
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();
*/
参考
有疑问加站长微信联系(非本文作者)