题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
做法
这道题有点像单调队列/单调栈
维护两个栈s1、s2,第一个栈用于淳朴的压栈出栈,目的是保存输入的数据。
第二个栈用于存储栈中的最小值,也就是说第二个栈的栈顶永远是最小值。
压栈时:s1压栈,如果s2的栈顶元素 >= 当前数据,那么就压栈(保证栈定永远是最小值)
出栈时:当s1.top == s2.top s2出栈。 s1出栈
class Solution {
Stack<Integer> s1 = new Stack<>(),s2 = new Stack<>();
public void push(int node) {
s1.push(node);
if (s2.empty()) {
s2.push(node);
} else if (s2.peek() >= node) {
s2.push(node);
}
}
public void pop() {
if (s1.peek() == s2.peek()) {
s2.pop();
}
s1.pop();
}
public int top() {
return s1.peek();
}
public int min() {
return s2.peek();
}
}