剑指Offer 30. 包含min函数的栈

发布时间 2023-08-27 20:20:03作者: 小星code

题目链接: 剑指Offer 30. 包含min函数的栈

题目描述:

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

解法思路:

首先理解题意:题目是要实现一个可以在 O(1) 的时间复杂度内得到栈中最小值得栈,如果是常规的栈,想要得到栈中的最小值,那一定得先弹出栈中所有的元素,然后找到最小值,显然这不是O(1)的复杂度;

因此采用经典的“空间换时间”的思路,当某个元素进栈时,在另一个辅助栈中保存当前此时栈中的最小元素,因此只要有元素进栈,那就维护这样一个辅助栈;

代码:

```golang
type MinStack struct {
    s   []int
    min []int
}

/** initialize your data structure here. */
func Constructor() MinStack {
    return MinStack{}
}

func (this *MinStack) Push(x int)  {
    this.s = append(this.s,x)
    if  len(this.min) == 0 ||x <= this.min[len(this.min)-1]{  //一定要注意 或 关系的前后顺序问题
        this.min = append(this.min,x)
    }
}

func (this *MinStack) Pop()  {
    if this.min[len(this.min)-1] == this.s[len(this.s)-1] {
        this.min = this.min[:len(this.min)-1]
    }
    this.s = this.s[:len(this.s)-1]
}


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


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


/**
 * Your MinStack object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Push(x);
 * obj.Pop();
 * param_3 := obj.Top();
 * param_4 := obj.Min();
 */