155. 最小栈

题目#

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

  • 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.

提示:

  • poptopgetMin 操作总是在 非空栈 上调用。

思路#

多了个 Min 属性的栈,核心难点在于 在常数时间内 检索到最小元素。如果扫描一下的话会是 O(n)。

由于栈是一个受限的线性表,因此我们可以用链表来实现该栈,并在每一节点上记录当前的最小值。由于栈是后进先出,因此我们只需要比较 top 处的节点就能更新 Min 了。

代码#

type MinStack struct {
tail *LNode
}
type LNode struct {
Val int
Min int
Next *LNode
Before *LNode
}
func Constructor() MinStack {
return MinStack{}
}
func (this *MinStack) Push(x int) {
if this.tail == nil {
this.tail = &LNode{x, x, nil, nil}
} else {
// 更新最小值
this.tail.Next = &LNode{x, myMin(x, this.tail.Min), nil, this.tail}
this.tail = this.tail.Next
}
}
func (this *MinStack) Pop() {
this.tail = this.tail.Before
}
func (this *MinStack) Top() int {
return this.tail.Val
}
func (this *MinStack) GetMin() int {
return this.tail.Min
}
func myMin(a, b int) int {
if a > b {
return b
}
return a
}
Last updated on