题目
题目链接
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
解题思路
题目理解
min(): 返回栈中的最小值
push(x): 压入一个参数 x 入栈
pop(): 弹出栈顶元素并返回
top(): 返回栈顶元素
min,push,pop 时间复杂度O(1): 意味着这三个方法中不能进行递归操作,代码执行一次就该获取到数据
具体思路
准备两个 Stack 栈,一个存储全量数据,一个存储最小值的栈,越接近栈顶,值越小。
push() 时,全量数据栈中直接入栈,最小值栈仅在 push() 的数据小于等于栈顶的数据才入栈。
为什么仅数据小于等于栈顶的数据才入最小值栈?因为大于的数据入栈无意义,且栈顶数据就是当前栈中的最小值。大的数据不出栈,小的数据也无法出栈,因此大数据丢弃即可。
等于情况下为什么也要入最小栈?假如我 push() 了两个 3,接着执行 pop() ,最小栈也要 pop()。此时最小的值还是 3,如果最小栈只设置了一次 3,此时最小栈就没数据了。
具体代码
class MinStack {
/**
* 栈
*/
private final Stack<Integer> stack;
/**
* 最小栈
*/
private final Stack<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
stack.add(x);
// 仅在 push() 的值,大于等于最小值时,添加入最小值栈
if (minStack.isEmpty() || minStack.peek() >= x) {
minStack.add(x);
}
}
public void pop() {
if (!stack.isEmpty() && !minStack.isEmpty() && stack.peek().equals(minStack.peek())) {
minStack.pop();
}
stack.pop();
}
public int top() {
// 不管
if (stack.isEmpty()) {
return 0;
}
return stack.peek();
}
public int min() {
if (minStack.isEmpty()) {
return 0;
}
return minStack.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();
*/