最小栈

题目

155. 最小栈

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

实现 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
  • 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
41
42
43
44
class MinStack {

private final Integer[] stack;
private Integer top;
private Integer min;
private int size;

public MinStack() {
this.size = -1;
this.stack = new Integer[30000000];
this.top = -1;
this.min = Integer.MAX_VALUE;
}

public void push(int val) {
top = val;
min = Math.min(min, val);
size ++;
stack[size] = val;
}

public void pop() {
stack[size] = null;
size--;
if(size == -1){
top = null;
min = Integer.MAX_VALUE;
return;
}
min = Integer.MAX_VALUE;
top = stack[size];
for (int i = 0; i <= size; i++) {
min = Math.min(min, stack[i]);
}
}

public int top() {
return this.top;
}

public int getMin() {
return this.min;
}
}

image-20241130225706751

题解二(链表)

此解法为本题最优解

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
class MinStack {
class DNode{
int val;
int min;
DNode next;
DNode(int val){
this.val = val;
min = val;
}
DNode(){}
}
DNode head;
public MinStack() {
head = new DNode();
head.next = null;
}

public void push(int val) {
DNode node = new DNode(val);
DNode t = head.next;
if(t==null){
head.next = node;
node = null;
return;
}
node.min = Math.min(node.min, t.min);
node.next = head.next;
head.next = node;
}

public void pop() {
head.next = head.next.next;
}

public int top() {
return head.next.val;
}

public int getMin() {
return head.next.min;
}
}

image-20241130230218630

题解三

官方题解,用栈实现栈,题解简直就是一坨💩💩

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
class MinStack {
Deque<Integer> xStack;
Deque<Integer> minStack;

public MinStack() {
xStack = new LinkedList<Integer>();
minStack = new LinkedList<Integer>();
minStack.push(Integer.MAX_VALUE);
}

public void push(int x) {
xStack.push(x);
minStack.push(Math.min(minStack.peek(), x));
}

public void pop() {
xStack.pop();
minStack.pop();
}

public int top() {
return xStack.peek();
}

public int getMin() {
return minStack.peek();
}
}