实现一个栈, 支持以下操作:
- push(val) 将 val 压入栈
- pop() 将栈顶元素弹出, 并返回这个弹出的元素
- min() 返回栈中元素的最小值
要求 O(1) 开销.
在线评测地址:[领扣题库官网](https://www.lintcode.com/problem/min-stack/?utm_source=sc-tianchi-sz0929
)
样例:
输入:
push(1)
min()
push(2)
min()
push(3)
min()
输出:
1
1
1
算法:最小栈
思路:
- 要求O(1)时间内完成所有操作,压入栈弹和出栈顶元素并返回本来就是O(1)没有问题,要返回栈中元素最小值也是O(1)就需要一个辅助栈。
- 在压入新元素时,如果辅助栈为空或者辅助栈顶元素大于新元素,那么新元素就是目前最小值,压入新元素;如果辅助栈顶元素小于新元素,那么再次压入栈顶元素。
- 在弹出元素时,辅助栈跟着一起弹出栈顶元素。
- 这样就满足了辅助栈内存储的最小值与存储数据的栈同步,查询最小值的操作是O(1)的。
复杂度:
- 空间复杂度取决于输入的数据
- 时间复杂度O(1)
public class MinStack {
Stack<Integer> stack, minStack;
public MinStack() {
stack = new Stack<Integer>();
minStack = new Stack<Integer>();
}
/*
* @param number: An integer
* @return: nothing
*/
public void push(int number) {
stack.push(number);
if (minStack.empty() || number < minStack.peek()) {
minStack.push(number);
} else {
minStack.push(minStack.peek());
}
}
/*
* @return: An integer
*/
public int pop() {
minStack.pop();
return stack.pop();
}
/*
* @return: An integer
*/
public int min() {
return minStack.peek();
}
}
更多题解参考:九章官网Solution