最小栈

· 约 3 分钟阅读 · 次阅读 leetcode

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

实现 MinStack 类:

MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int getMin() 获取堆栈中的最小元素。  

示例 1:

输入: [“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.


辅助栈-python实现

class MinStack:
    def __init__(self):
        self.stack = []
        self.min_stack = [math.inf]

    def push(self, val: int) -> None:
        self.stack.append(val)
        self.min_stack.append(min(val, self.getMin()))

    def pop(self) -> None:
        self.stack.pop()
        self.min_stack.pop()

    def top(self) -> int:
        return self.stack[-1]

    def getMin(self) -> int:
        return self.min_stack[-1]



# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

辅助栈-go实现

type MinStack struct {
    stack []int
    minStack []int
    length int
}


func Constructor() MinStack {
    return MinStack{
        stack: []int{},
        minStack: []int{math.MaxInt64},
    }
}


func (this *MinStack) Push(val int)  {
    this.stack = append(this.stack, val)
    top := this.minStack[len(this.minStack)-1]
    this.minStack = append(this.minStack, min(top, val))
}


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) GetMin() int {
    return this.minStack[len(this.minStack)-1]
}

func min(x, y int) int {
    if x < y {
        return x
    }
    return y
}

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

存储和最小值的差值

python实现

class MinStack:
    def __init__(self):
        self.stack = []
        self.min_value = -1

    def push(self, val: int) -> None:
        if not self.stack:
            self.stack.append(0)
            self.min_value = val
            return
        diff = val - self.min_value
        # 当出现更小的数时,此时更新min_value
        if diff < 0:
            self.min_value = val
        self.stack.append(diff)

    def pop(self) -> None:
        if not self.stack:
            return None
        diff = self.stack.pop()
        top = self.min_value + diff
        # 弹出时为负数,此时最小值即为栈顶值
        if diff < 0:
            top = self.min_value
            self.min_value = self.min_value - diff
        return top

    def top(self) -> int:
        if not self.stack:
            return -1
        diff = self.stack[-1]
        top = self.min_value + diff
        if diff < 0:
            top = self.min_value
        return top

    def getMin(self) -> int:
        if not self.stack:
            return -1
        return self.min_value



# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

go实现


type MinStack struct {
    stack []int
    minValue int
}


func Constructor() MinStack {
    return MinStack{
        stack: []int{},
        minValue: 0,
    }
}


func (this *MinStack) Push(val int)  {
    if len(this.stack) == 0{
        this.stack = append(this.stack, 0)
        this.minValue = val
    }else{
        diff := val - this.minValue
        this.stack = append(this.stack, diff)
        if diff < 0{
            this.minValue = val
        }
    }
}


func (this *MinStack) Pop()  {
    if len(this.stack) > 0{
        diff := this.stack[len(this.stack)-1]
        if diff < 0{
            this.minValue = this.minValue - diff
        }
        this.stack = this.stack[:len(this.stack)-1]
    }
}


func (this *MinStack) Top() int {
    if len(this.stack) > 0{
        diff := this.stack[len(this.stack)-1]
        if diff < 0{
            top := this.minValue
            return top
        }else{
            top := diff + this.minValue
            return top
        }
    }
    return -1
}



func (this *MinStack) GetMin() int {
    return this.minValue
}

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