题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
Leetcode链接:剑指offer面试题30:包含min函数的栈
算法分析
在栈中维护一个额外的min数组:
- 每次Push时判断当前入栈的元素是否小于等于(之所以要等于和对Pop操作的处理有关)min数组中最小的元素(即最后一个元素),若满足该条件,即将当前入栈元素加入min数组的最后一位;
- 每次Pop判断当前出栈的元素是否等于min数组中最小的元素,若等于,就将min数组最后一位舍去,完成该操作后min数组的最后一位仍然是最小元素。
- Push,Pop,Min操作的时间复杂度均为O(1)。
Golang代码如下
type MinStack struct {
val []int
min []int
size int
}
/** initialize your data structure here. */
func Constructor() MinStack {
return MinStack{nil, nil, 0}
}
func (this *MinStack) Push(x int) {
if this.min == nil || len(this.min) == 0 || x <= this.min[len(this.min) - 1] {
this.min = append(this.min, x)
}
this.val = append((*this).val, x)
this.size++
}
func (this *MinStack) Pop() {
if this == nil || this.size == 0 {
return
}
if this.val[this.size - 1] == this.min[len(this.min) - 1] {
this.min = this.min[:len(this.min)-1]
}
this.val = this.val[:this.size-1]
this.size--
}
func (this *MinStack) Top() int {
if this == nil || this.size == 0 {
return math.MaxInt64
}
return this.val[this.size - 1]
}
func (this *MinStack) Min() int {
return this.min[len(this.min) - 1]
}