155. 最小栈(简单)

1,问题描述

155. 最小栈

难度:中等

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

2,初步思考

​ 2种解决思路:

1️⃣ 额外空间使用一个最小栈,用于辅助常数时间复杂度查询最小值

2️⃣ 使用Pair作为存储载体,同时存储当前值和当前最小值

3,代码处理

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
66
67
68
69
70
71
72
73
74
75
import support.Pair;

import java.util.ArrayDeque;
import java.util.Deque;

public class _155最小栈 {
}

// 使用辅助栈
class MinStack_v2 {

Deque<Integer> dataStack = new ArrayDeque<>();
Deque<Integer> minStack = new ArrayDeque<>();

public MinStack_v2() {
}

public void push(int val) {
dataStack.push(val);
if (minStack.isEmpty() || val <= minStack.peek()) {
minStack.push(val);
}
}

public void pop() {
Integer val = dataStack.pop();
if (val <= minStack.peek()) {
minStack.pop();
}
}

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

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


// 使用Pair数据结构
class MinStack_v1 {

Deque<Pair<Integer, Integer>> stack = new ArrayDeque<>();

public MinStack_v1() {
}

public void push(int val) {
if (stack.isEmpty()) {
stack.push(new Pair(val, val));
} else {
int min = Math.min(val, stack.peek().getValue());
stack.push(new Pair(val, min));
}
}

public void pop() {
stack.pop();
}

public int top() {
return stack.peek().getKey();
}

public int getMin() {
return stack.peek().getValue();
}
}

/**
* 5,3,1,1,6,1
* 5,3,1,1,1,1
*/