本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路:
1.额外再维护一个最小栈(空间换时间),数据栈 + 最小栈
2.push:当前元素比最小栈的top元素小,则数据栈和最小栈都push当前元素;
反之若当前元素大于最小栈的top元素,则数据栈push,最小栈仍然push最小栈的top元素(即当前小值)
3.pop:数据栈 & 最小栈 同时pop
4.min:返回最小栈top元素
时间复杂度:
O(1),push(), pop(), top(), min() 四个函数的时间复杂度均为常数级别。
空间复杂度 :
O(N),当共有 N 个待入栈元素时,辅助栈 B 最差情况下存储 N 个元素,使用 O(N)额外空间。
/*
思路:
1.额外再维护一个最小栈(空间换时间),数据栈 + 最小栈
2.push:当前元素比最小栈的top元素小,则数据栈和最小栈都push当前元素;
反之若当前元素大于最小栈的top元素,则数据栈push,最小栈仍然push最小栈的top元素(即当前小值)
3.pop:数据栈 & 最小栈 同时pop
4.min:返回最小栈top元素
*/
type MinStack struct {
stack []int
minStack []int
}
/** initialize your data structure here. */
func Constructor() MinStack {
return MinStack{
stack: make([]int, 0),
minStack: make([]int, 0),
}
}
// 数据栈 + 最小栈 :同时push操作
func (this *MinStack) Push(x int) {
this.stack = append(this.stack, x)
if len(this.minStack) > 0 { // 非首次
// 判断x是否大于最小栈的栈顶元素,如果大于minStack中追加minStack的栈顶元素,如果小于则追加x
minOfMinStack := this.minStack[len(this.minStack)-1]
if x < minOfMinStack {
this.minStack = append(this.minStack, x)
} else {
this.minStack = append(this.minStack, minOfMinStack)
}
} else { // 首次
this.minStack = append(this.minStack, x)
}
}
func (this *MinStack) Pop() {
this.stack = this.stack[:len(this.stack)-1]
this.minStack = this.minStack[:len(this.minStack)-1]
}
func (this *MinStack) Top() int {
return this.stack[len(this.stack)-1]
}
func (this *MinStack) Min() int {
return this.minStack[len(this.minStack)-1]
}
/**
* Your MinStack object will be instantiated and called as such:
* obj := Constructor();
* obj.Push(x);
* obj.Pop();
* param_3 := obj.Top();
* param_4 := obj.Min();
*/