解题思路
本题是一道特殊的数据结构设计问题,要求我们设计出一个包含 stack.min() 方法的栈,并且要求 min,push,pop 这些方法的时间复杂度均为 O(1)
我的思路为,在这个最小栈中维护两个栈,一个是正常的实现存储数据功能的栈,命名为 dataStack,还有一个是专门用来维护此时栈中最小的元素的栈,命名为 minStack,该栈的栈顶始终存储栈中最小的元素。
当我们向栈中压入一个数据时,dataStack 正常执行 push 操作;minStack 则是要比较压入的数据与栈顶元素的大小,如果新压入的数据比栈顶元素大,那么我们就将栈顶元素复制一份压入至 minStack 中,如果新压入的数据比栈顶元素小,那么我们就压入新的数据到 minStack 中,这样做的目的是时时维护 minStack 栈顶的元素是当前数据栈中最小的元素。
出栈操作就比较简单了,我们只需让 dataStack 和 minStack 同步出栈即可。
代码
class MinStack {private Stack<Integer> dataStack;private Stack<Integer> minStack;/** initialize your data structure here. */public MinStack() {dataStack = new Stack<>();minStack = new Stack<>();}public void push(int x) {if(dataStack.isEmpty()){dataStack.push(x);minStack.push(x);}else {dataStack.push(x);if(minStack.peek() < x){minStack.push(minStack.peek());}else {minStack.push(x);}}}public void pop() {minStack.pop();dataStack.pop();}public int top() {return dataStack.peek();}public int min() {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();*/
复杂度分析
- 时间复杂度:O(1)
push(),pop(),top(),min() 四种操作的时间复杂度均为 O(1)
- 空间复杂度:O(N)
我们使用的辅助栈 minStack 使用了 O(N) 的额外空间
