155. 最小栈

设计一个支持 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.

提示:

  • -231 <= val <= 231 - 1
  • poptop 和 getMin 操作总是在 非空栈 上调用
  • pushpoptop, and getMin最多被调用 3 * 104 次

题目已经给好了大致的方法,因此定义结构和函数具体内容即可:

  1. 根据要求需要常数级检索最小元素,因此一般单独字段直接存即可;
  2. 又因为 stack 先进后出的性质,在 pop 操作后,为了保证 getMin 扔能正确执行,还应该更新最小值,因此还应该记录每次 push 的时候当时最小值的更新现场。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
type MinStack struct {
MinVal int
Data []int
}


func Constructor() MinStack {
return MinStack{
Data: make([]int, 0),
MinVal: -1,
}
}


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


func (this *MinStack) Pop() {
if len(this.Data) == 0 {
return
}
diff := this.Data[len(this.Data)-1]
if diff < 0 {
this.MinVal = this.MinVal - diff
}
this.Data = this.Data[:len(this.Data)-1]
}


func (this *MinStack) Top() int {
if len(this.Data) == 0 {
return -1
}
diff := this.Data[len(this.Data)-1]
if diff < 0 {
return this.MinVal
}
return this.MinVal + diff
}


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


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