题目描述(2021-3-12)
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例1:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
说明:
- 各函数的调用总次数不超过 20000 次
解题思路
维护一个数据栈和一个辅助栈。数据栈用于存放每次新进入的x,辅助栈用于存放每个x进入数据栈后的最小值降序排列,(即辅助栈的top()始终存放着当前数据栈的最小值)。
参考代码
class MinStack {
Stack<Integer> s1;
Stack<Integer> s2;
/** initialize your data structure here. */
public MinStack() {
//栈1存放需要压栈的值
s1 = new Stack<>();
//栈2存放最小值
s2 = new Stack<>();
}
public void push(int x) {
//入栈1
s1.push(x);
//如果栈2为空或入栈的值小于等于栈2的栈顶元素,则入栈2
if(s2.empty() || s2.peek() >= x){
s2.push(x);
}
}
public void pop() {
//栈1弹出去的值等于栈2的栈顶值,栈2弹出
if(s1.pop().equals(s2.peek())){
s2.pop();
}
}
public int top() {
return s1.peek();
}
public int min() {
return s2.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
运行结果
执行用时:22 ms, 在所有 Java 提交中击败了91.27%的用户
内存消耗:40.3 MB, 在所有 Java 提交中击败了69.32%的用户