设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 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
pop、top 和 getMin 操作总是在 非空栈 上调用
push, pop, top, and getMin最多被调用 3 * 104 次
第一种:栈
class MinStack {
// 数据栈,用于存储元素
public Stack<Integer> data;
// 最小值栈,用于存储当前栈内的最小值
public Stack<Integer> min;
// 构造函数,初始化两个栈
public MinStack() {
data = new Stack<Integer>();
min = new Stack<Integer>();
}
// 元素入栈操作
public void push(int val) {
data.push(val); // 将元素压入数据栈
// 如果最小值栈为空,或者新元素小于当前最小值栈顶元素
if (min.empty() || val < min.peek()) {
min.push(val); // 将新元素压入最小值栈
} else {
min.push(min.peek()); // 否则将当前最小值栈顶元素再次压入最小值栈,保持与数据栈元素个数一致
}
}
// 元素出栈操作
public void pop() {
data.pop(); // 从数据栈中弹出一个元素
min.pop(); // 同时从最小值栈中弹出一个元素,保持两个栈的同步
}
// 获取栈顶元素
public int top() {
return data.peek(); // 返回数据栈的栈顶元素,不出栈
}
// 获取当前栈内的最小值
public int getMin() {
return min.peek(); // 返回最小值栈的栈顶元素,即当前栈内的最小值
}
}
第二种:数组自定义栈
class MinStack {
public final int MAXN = 8001; // 定义最大容量
int[] data; // 存储元素的数组
int[] min; // 存储当前最小元素的数组
int size; // 栈的大小
public MinStack() {
data = new int[MAXN]; // 初始化data数组
min = new int[MAXN]; // 初始化min数组
size = 0; // 初始化栈大小
}
// 入栈操作
public void push(int val) {
data[size] = val; // 将元素放入data数组
if (size == 0 || val < min[size - 1]) {
min[size] = val; // 更新min数组,如果val比前一个最小值小
} else {
min[size] = min[size - 1]; // 如果val不是最小值,保持原最小值
}
size++; // 增加栈大小
}
// 出栈操作
public void pop() {
size--; // 减少栈大小,相当于出栈
}
// 获取栈顶元素
public int top() {
return data[size - 1]; // 返回栈顶元素
}
// 获取栈中的最小元素
public int getMin() {
return min[size - 1]; // 返回当前最小元素
}
}
https://leetcode.cn/problems/min-stack/description/
参考左程云老师算法系列