设计问题-最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。

示例:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

辅助栈

复杂度分析

  • 时间复杂度:对于题目中的所有操作,时间复杂度均为 O(1)。因为栈的插入、删除与读取操作都是 O(1),我们定义的每个操作最多调用栈操作两次。
  • 空间复杂度:O(n),其中 n 为总操作数。最坏情况下,我们会连续插入 n 个元素,此时两个栈占用的空间为 O(n)。

设定两个数组,一个是作为栈,一个是记录最小当前最小值的辅助栈数组
数据栈和辅助栈的数据要同步添加,出栈也是要同步出,这样才能保证数据一 一对应

  push(-2)                push(0)           push(-3)            pop()             top()
                                          -3       -3
                        0       -2         0       -2        0       -2         0       -2
-2       -2            -2       -2        -2       -2       -2       -2        -2       -2
stack  minStack      stack  minStack     stack  minStack   stack  minStack     stack  minStack 
type MinStack struct {
    stack []int
    minStack []int
}


/** initialize your data structure here. */
func Constructor() MinStack {
    return MinStack{
         stack : []int{},
         minArr : []int{math.MaxInt64},//记录最小栈
    }
}


func (this *MinStack) Push(x int)  {
    this.stack = append(this.stack,x)  //将元素添加入栈内
    min := this.minArr[len(this.minArr) - 1] //获取最小栈中最顶层的最小值
    this.minArr = append(this.minArr,Min(min,x))//比较后,将最小值入栈 
}


func (this *MinStack) Pop()  {
    //出栈操作,两边都需要出栈,保证两边数据同步一一对应
    this.stack = this.stack[:len(this.stack)-1]
    this.minArr = this.minArr[:len(this.minArr)-1]

}


func (this *MinStack) Top() int {
    return this.stack[len(this.stack)-1]
}


func (this *MinStack) GetMin() int {
    return this.minArr[len(this.minArr)-1]
}
func Min(a,b int) int{
    if a > b {
        return b
    }
    return a
}

/**
 * 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();
 */

你可能感兴趣的:(设计问题-最小栈)