问题描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
例子
示例 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,在出栈时,同时将两个栈出栈并更新min的值为辅助栈顶值,保证min是正确的。
static class MinStack {
Stack<Integer> stack;
Stack<Integer> stack2;//辅助栈
public int min;//记录最小值
public MinStack() {
min=Integer.MAX_VALUE;
stack=new Stack<>();
stack2=new Stack<>();
stack2.push(min);
}
public void push(int x) {
System.out.println("加入的值为:"+x);
stack.push(x);
min= Math.min(x, min);//记录最小值
stack2.push(min);
System.out.println("加入后栈为:"+stack);
}
public void pop() {
stack.pop();
stack2.pop();
min=stack2.peek();//出栈后及时更新min的值
System.out.println("出栈后栈为:"+stack);
}
public int top() {
System.out.println("栈顶元素为:"+stack.peek());
return stack.peek();
}
public int min() {
System.out.println("最小值为:"+min);
return min;
}
}
题目来源:力扣(LeetCode)
链接: LeetCode题目