
时间复杂度:O(1),空间复杂度:O(n)
解题思路
入栈出栈没什么难度,主要是如何维护最小值,用O(1)的时间复杂度获取到栈中的最小值。
其实可以用一个辅助栈来维护当前栈中的最小值,每当一个元素入栈,就比较这个元素值与辅助栈栈顶的值,如果前者更小那就让前者入辅助栈,否则让后者入辅助栈。这样随着栈的动态维护,辅助栈也会随之更新维护,栈顶始终是当前栈的最小值。
让辅助栈的栈顶元素重复入栈的目的是,一旦正常栈的栈顶元素出栈,辅助栈的栈顶元素还是当前栈中的最小元素。
另外,一定要注意辅助栈初始化时要有一个表示最大数的元素,以防辅助栈空。
AC代码
type MinStack struct {
stk,minStk []int
}
func Constructor() MinStack {
return MinStack{[]int{},[]int{math.MaxInt64}}
}
func (this *MinStack) Push(val int) {
this.stk=append(this.stk,val)
m:=this.minStk[len(this.minStk)-1]
if val<m{
this.minStk=append(this.minStk,val)
}else{
this.minStk=append(this.minStk,m)
}
}
func (this *MinStack) Pop() {
this.stk=this.stk[:len(this.stk)-1]
this.minStk=this.minStk[:len(this.minStk)-1]
}
func (this *MinStack) Top() int {
return this.stk[len(this.stk)-1]
}
func (this *MinStack) GetMin() int {
return this.minStk[len(this.minStk)-1]
}
/**
* Your MinStack object will be instantiated and called as such:
* obj := Constructor();
* obj.Push(val);
* obj.Pop();
* param_3 := obj.Top();
* param_4 := obj.GetMin();
*/
感悟
一开始想到用数组记录所有的最小值情况,其实就是和辅助栈一样。

博客围绕栈操作展开,重点探讨如何用O(1)时间复杂度获取栈中最小值。提出用辅助栈维护最小值的思路,入栈时比较元素与辅助栈栈顶值,更新辅助栈,保证栈顶为当前最小值。还提醒辅助栈初始化要有表示最大数的元素。

被折叠的 条评论
为什么被折叠?



