这个问题当然也是leetcode上的原题,无非就是使用一个额外的栈来存储最小值,每次入栈的时候进行判断就行了。但是如果要求空间复杂度为O(1)呢,即不使用额外的空间该怎么办。答案就是栈不存储元素,而是存储差值。总体来说就是:
- 入栈的时候将元素
x
与当前最小值min
的差值x-min
入栈 - 出栈的时候判断一下栈顶,如果栈顶大于等于0,那就是当前的最小值min加上栈顶。因为我们入栈的时候
x-min
大于0且入栈top
,那么出栈就应该是top+min=x
了。
代码如下:
class MinStack {
Stack<Integer> stack;
int min; //用来存放当前的最小值
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
}
public void push(int x) {
if (stack.isEmpty()) { //如果没有元素,则第一个存放的是最小值,且把0存进去
stack.push(0);
min = x;
return;
}
stack.push(x-min); //负责存储差值
if(x < min) { //及时更新最小值
min = x;
}
}
public void pop() {
if(stack.peek() >= 0) {
//return stack.pop() + min;
stack.pop(); //pop的时候如果栈顶大于0,说明最小值不会变化
} else {
min = min - stack.pop(); //否则pop的时候要更改最小值
//return min;
}
}
public int top() {
if(stack.peek() >= 0) {
return stack.peek() + min; //若栈顶大于0实际栈顶元素就是当前栈顶+最小值
} else {
return min - stack.peek(); //否则就是最小值-栈顶
}
}
public int getMin() {
return min; //直接返回当前最小值
}
}
/**
* 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.getMin();
*/