题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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 次
解题思路
1.题目要求我们实现一个能够得到栈的最小元素的 min 函数,且调用 min、push 及 pop 的时间复杂度都是 O(1)。我们需要用到两个栈去解决这个问题。
2.举个例子:
下面我们开始进行入栈操作,在入栈第一个元素时Stack1直接入栈,而当Stack2为空时我们也将元素直接入栈。
在入栈第二个元素时Stack1依旧直接入栈,这时我们发现要入栈的元素大于Stack2的栈顶元素,所以我们不对Stack2进行入栈操作,
以下入栈操作的思路相同,Stack1正常入栈,Stack2只有在空的时候或者栈顶元素大于被入栈元素时才进行入栈。
此时入栈操作全部执行结束,我们来看看出栈操作,
在出栈操作时,我们需要先判断Stack1是否为空,要保证我们有元素可以出栈,当Stack1不为空时,Stack2一定也不为空。然后我们将Stack1的栈顶元素与Stack2的栈顶元素进行比较,若两元素不同,则只将Stack1进行出栈,否则就要将Stack1和Stack2同时出栈。
出栈操作执行结束。
3,还有最后两个方法,pop()求栈顶元素时我们只需要返回Stack1的栈顶即可,min()求栈中最小元素时我们只需要返回Stack2的栈顶元素即可。
代码实现
class MinStack {
Stack<Integer> Stack1;
Stack<Integer> Stack2;
/** initialize your data structure here. */
public MinStack() {
Stack1 = new Stack();
Stack2 = new Stack();
}
public void push(int x) {
Stack1.push(x);
if(Stack2.isEmpty() || x <= Stack2.peek() ){
Stack2.push(x);
}
}
public void pop() {
if(!Stack1.isEmpty()){
//数值大于 127,比较的就是一个对象
if(Stack1.peek().intValue() == Stack2.peek().intValue()){
Stack2.pop();
}
Stack1.pop();
}
}
public int top() {
return Stack1.peek();
}
public int min() {
return Stack2.peek();
}
}