实现一个这样的栈,这个栈除了可以进行普通的push、pop操作以外,还可以进行getMin的操作,getMin方法被调用后,会返回当前栈的最小值。栈里面存放的都是 int 整数,并且数值的范围是 [-100000, 100000]。要求所有操作的时间复杂度是 O(1)。
附加:如果空间复杂度也能O(1)的话可加分。
解:存放差值
若将a={2,1,3,.0}入栈,
2进,初始化栈顶为0 , 最小值为2
1进,栈顶为差值1-2,差值 小于0,最小值为1
3进,栈顶为差值3-1 差值大于0,最小值为1
0进,栈顶为差值0-1 ,差值小于0,最小值为0
所以堆栈为{0,-1,2,-1}
链接:https://www.cxyxiaowu.com/2968.html
代码实现:
public class 设计一个有gitMin的栈 {
private Stack<Integer> stack = new Stack<Integer>();
private int min;
public void push(int x) {
if (stack.isEmpty()) {
min = x;
stack.push(0);
} else {
// 计算差值
int compare = x - min;
stack.push(compare);
// 如果差值小于0,显然 x 成为最小值,否则最小值不变
min = compare < 0 ? x : min;
}
}
public void pop() {
int top = stack.peek();
// 如果top小于0,显然最小值也一并会被删除,此时更新最小值
min = top < 0 ? (min - top) : min;
stack.pop();
}
public int getMin() {
return min;
}
}