最小栈

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
输入:
["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
  • poptopgetMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 104

要求设计一个栈,同时维护按照入栈顺序的元素和最小元素,可以设置一个节点类,存储当前值和最小值

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
class MinStack {
class Node {
int cur;
int min;
}

private Node[] stack;
private int n = 30000;
private int top = -1;

public MinStack() {
stack = new Node[n];
}

public void push(int val) {
Node node = new Node();
node.cur = val;
if (top == -1) {
node.min = val;
} else {
node.min = Math.min(getMin(), val);
}
stack[++top] = node;
}

public void pop() {
top--;
}

public int top() {
Node node = stack[top];
return node.cur;
}

public int getMin() {
Node node = stack[top];
return node.min;
}
}