题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.
解题思路
思路参照 LeetCode 题解区大佬 krahets的题解
创建两个栈,栈 A 用于正常压栈和弹栈。栈 B 用于记录当前最小的数,若当前压进栈 A 的值小于等于栈 B 的顶部,那么将这个数同时也压进栈 B。
Java代码实现
class MinStack { /** initialize your data structure here. */ private Stack<Integer> stackA; private Stack<Integer> stackB; public MinStack() { stackA = new Stack<Integer>(); stackB = new Stack<Integer>(); } public void push(int x) { stackA.push(x); if (stackB.empty() || stackB.peek() >= x) { stackB.push(x); } } public void pop() { int val = stackA.pop(); if (val == stackB.peek()) stackB.pop(); } public int top() { return stackA.peek(); } public int min() { return stackB.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(); */