题目链接: 剑指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();
*/
标签:MinStack,Offer,int,复杂度,30,min,栈中
From: https://www.cnblogs.com/lxing-go/p/17660754.html