题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.
提示:
各函数的调用总次数不超过 20000 次
|
思路
这道题需要注意的是:
min方法:获取栈中的最小数但是这个数不会弹出栈
top方法:获取栈顶元素,这个数不会弹出栈
push方法:向栈中放入元素
pop方法:弹出栈顶元素
关键就是min方法,因为要min方法为O(1),所以我们必须存放min的那个数据结构,我们另外使用一个栈存放这个min,要保证每次最小的数据要放到栈顶,然后只有pop方法的时候会从栈顶拿出数据,所以我们要在pop方法的时候判断另外的一个栈B是否也需要pop数据
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| private static class MinStack { Stack<Integer> A, B;
public MinStack() { A = new Stack<>(); B = new Stack<>(); }
public void push(int x) { A.push(x);
if (B.empty() || B.peek() >= x) { B.push(x); } }
public void pop() { if (A.pop().equals(B.peek())) { B.pop(); } }
public int top() { return A.peek(); }
public int min() { return B.peek(); }
}
|