算法
    按照上面的思路,我们只需要设计一个数据结构,使得每个元素 a 与其相应的最小值 m 时刻保持一一对应。因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。

    • 当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;
    • 当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;
    • 在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。 ```go //辅助栈写法 type MinStack struct { stack []int minStack []int }

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

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

    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 }

    1. <a name="Vmgkq"></a>
    2. ### 解题思路
    3. 用两个stack很好解这一道题,需要额外 O(N) 的空间,这里提供一种 O(1) 额外空间的思路。<br />与其直接在 stack 存每个值,我们存每个值与当前最小值 min 的差值 (val-min):
    4. 1. push:<br />1). 如果当前没有任何元素,则把 min 设为当前 val<br />2). 同时,往 stack 放 val-min
    5. 1. pop:<br />1). 如果栈顶元素是非负数(比之前的 min 大,或相同),则直接pop栈顶元素<br />2). 如果栈顶元素是负数(比之前的 min 小),则当前栈顶元素就是目前的 min, pop出来之后需要更新 min = min - (栈顶数值)
    6. 1. top:<br />1). 如果栈顶元素是正数(比之前的 min 大),则 top 数值 = min + (栈顶数值)<br />2). 如果栈顶元素是非正数(比之前的 min 小,或相同),则当前 top 元素就等于目前的 min
    7. 1. getMin:<br />直接 return min 即可
    8. ```go
    9. //模拟写法
    10. type MinStack struct {
    11. stk []int
    12. min int
    13. size int
    14. }
    15. /** initialize your data structure here. */
    16. func Constructor() MinStack {
    17. return MinStack{stk: make([]int, 0), min: math.MaxInt64}
    18. }
    19. func (this *MinStack) Push(val int) {
    20. if this.size == 0 {
    21. this.min = val
    22. }
    23. this.stk = append(this.stk, val-this.min)
    24. if this.min > val {
    25. this.min = val
    26. }
    27. this.size++
    28. }
    29. func (this *MinStack) Pop() {
    30. if this.stk[this.size-1] < 0 {
    31. this.min -= this.stk[this.size-1]
    32. }
    33. this.stk = this.stk[:this.size-1]
    34. this.size--
    35. }
    36. func (this *MinStack) Top() int {
    37. if this.stk[this.size-1] >= 0 {
    38. return this.min + this.stk[this.size-1]
    39. }
    40. return this.min
    41. }
    42. func (this *MinStack) GetMin() int {
    43. return this.min
    44. }