栈与队列中等2 种解法
#155最小栈
实现支持 push、pop、top 和 O(1) getMin 的栈。
#设计#栈
解题主线
01
每个元素同时保存入栈后对应的最小值,弹栈时最小值自然回退。
02
双栈法让最小值栈与数据栈严格同步,每层都保存当前最小值。
解法 1:值与当前最小值成对入栈
每个栈帧保存 [value, minSoFar],所有操作只访问栈顶。
时间复杂度
所有操作 O(1)
空间复杂度
O(n)
java
import java.util.ArrayDeque;
import java.util.Deque;
final class MinStack {
private final Deque<int[]> stack = new ArrayDeque<>();
public void push(int value) {
int minimum = stack.isEmpty() ? value : Math.min(value, stack.peek()[1]);
stack.push(new int[] {value, minimum});
}
public void pop() {
stack.pop();
}
public int top() {
return stack.element()[0];
}
public int getMin() {
return stack.element()[1];
}
}每个栈帧保存 [value, minSoFar],所有操作只访问栈顶。
解法 2:数据栈 + 最小值栈
每次 push 都在辅助栈压入新的当前最小值,pop 时两栈同步弹出。
时间复杂度
所有操作 O(1)
空间复杂度
O(n)
java
import java.util.ArrayDeque;
import java.util.Deque;
final class MinStack {
private final Deque<Integer> values = new ArrayDeque<>();
private final Deque<Integer> minimums = new ArrayDeque<>();
public void push(int value) {
values.push(value);
minimums.push(minimums.isEmpty() ? value : Math.min(value, minimums.peek()));
}
public void pop() {
values.pop();
minimums.pop();
}
public int top() {
return values.element();
}
public int getMin() {
return minimums.element();
}
}每次 push 都在辅助栈压入新的当前最小值,pop 时两栈同步弹出。
- 补上旧双栈实现遗漏的 minimums.pop()。
边界与易错点
- 旧双栈版 pop 只弹数据栈而未弹 minStack,导致最小值永久残留。
- 重复最小值也必须逐层保存或计数,否则弹出一个后会错误丢失最小值。
- ArrayDeque 不允许 null;题目保证只在非空栈调用查询操作。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
medium/Q155_MinStack.java