题目来自LeetCode,链接:面试题30. 包含min函数的栈。具体描述为:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min
函数在该栈中,调用min
、push
及pop
的时间复杂度都是O(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.
这种题目要求各种操作都是 O ( 1 ) O(1) O(1)复杂度的就是明显的单调栈的题目了,具体做法就是在一个标准的栈之外用一个辅助栈维持一个单调栈,像在这里需要最小值的话那就是维护一个最小栈,最小栈里的元素从栈底到栈顶是单调非增的,这样就可以保证每次从最小栈的栈顶获得的元素都是栈的最小元素。入栈的时候跟最小栈的栈顶元素相比,只要不大于栈顶元素,当前元素就需要入最小栈。然后出栈的时候如果出栈元素跟最小栈的栈顶元素一样的话也需要将其最小栈栈顶元素出栈。
JAVA版代码如下:
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
stack.push(x);
if (minStack.size() == 0 || minStack.peek() >= x) {
minStack.push(x);
}
}
public void pop() {
if (stack.pop().equals(minStack.peek())) {
minStack.pop();
}
}
public int top() {
return stack.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();
*/
提交结果如下:
![](https://img-blog.csdnimg.cn/20200518234023601.png)
Python版代码如下:
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.minStack = []
def push(self, x: int) -> None:
self.stack.append(x)
if not self.minStack or self.minStack[-1] >= x:
self.minStack.append(x)
def pop(self) -> None:
if self.stack.pop() == self.minStack[-1]:
self.minStack.pop()
def top(self) -> int:
return self.stack[-1]
def min(self) -> int:
return self.minStack[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.min()
提交结果如下:
![](https://img-blog.csdnimg.cn/20200518234543594.png)