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

实现 MinStack 类:

MinStack() 初始化堆栈对象。

void push(int value) 将元素 value 推入堆栈。

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.

提示:

-2(31) <= val <= 2(31) - 1

pop、top 和 getMin 操作总是在 非空栈 上调用

push, pop, top, and getMin最多被调用 3 * 10(4) 次

可以使用辅助栈,每次push时在辅助栈中记录当前最小值

也可以记录最小值push差值,每次push时记录当前最小值与push值的差值,有新最小值进来时差值一定大于0

此时再更新最小值,在pop时如果遇到大于0的值需要把最小值还原

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
class MinStack {
public:
stack<long> a;
long minL;
MinStack() {}
void push(int x) {
if (a.empty()) {
a.push(0);
minL = x;
} else {
a.push((long)x - minL);
minL = min(minL, (long)x);
}
}
void pop() {
if (a.top() < 0)
minL = minL - a.top();
a.pop();
}
int top() {
if (a.top() < 0)
return minL;
else
return a.top() + minL;
}
int getMin() { return minL; }
};