这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
什么是最小栈?
最小栈也是一个栈(存的元素都是数字),只不过这种数据结构除了有push、pop、top等和普通栈相同的方法外,还有一个方法get_min用来获取当前栈中的最小元素。
算法思想
首先肯定要有一个变量来保存最小的元素值或者间接的保存最小元素值。 那么这个变量是什么呢?list、dict、还是其他?
一步一步分析,如何才能获取最小值,而且还不影响push、pop、top操作,那么需要保存的数据有两个:
- 元素的值(这样pop、push的操作才不会受影响)
- 实时的最小元素(这肯定是一个变化的值)
如果保存最小值使用一个数组保存,那么当执行push、pop的时候,这个数组也要相应更新。这样肯定没办法在O(1)的时间复杂度内完成。如果不能直接保存元素,那我们可以保存栈内元素和最小元素之间的关系,这样在执行pop、push的时候进行计算保存,同时有一个变量保存实时的最小值,那么就实现了O(1)时间内获取最小元素。
代码实现:
import "container/list"
type MinStack struct {
stack *list.List
minStack *list.List
}
func Constructor() MinStack {
return MinStack{
stack: list.New(),
minStack: list.New(),
}
}
func (this *MinStack) Push(val int) {
this.stack.PushBack(val)
if this.minStack.Len() == 0 || val <= this.minStack.Back().Value.(int) {
this.minStack.PushBack(val)
}
}
func (this *MinStack) Pop() {
if this.stack.Remove(this.stack.Back()).(int) == this.minStack.Back().Value.(int) {
this.minStack.Remove(this.minStack.Back())
}
}
func (this *MinStack) Top() int {
return this.stack.Back().Value.(int)
}
func (this *MinStack) GetMin() int {
return this.minStack.Back().Value.(int)
}