可以不使用线性的额外空间,只需要O(1)的额外空间复杂度:
· 记录minx,表示当前最小值。push(x)时,判断x是否大于minx。
· 使用栈s,push的不是原始插入值,而是差值:x-minx。
若x>=minx,则皆大欢喜,直接push(x-minx),不需要修改minx。对应的pop也一样,直接加回去即可。
若x<minx,则x-minx < 0,在push(x-minx)后顺便更新minx。对应的pop也是逆运算。
#include <stdio.h>
#include <stack>
#include <algorithm>
struct MinStack {
std::stack<int> s;
int minx = 0;
MinStack() : s() {}
void push(int x) {
if (s.size() == 0) {
s.push(x);
minx = x;
return;
}
if (x >= minx) {
s.push(x - minx);
}
else {
s.push(x - minx);
minx = x;
}
}
int pop() {
if (s.size() == 1) {
s.pop();
return minx;
}
int x = s.top();
s.pop();
if (x >= 0) {
return minx + x;
}
else {
int r = minx;
minx -= x;
return r;
}
}
int min() {
return minx;
}
};
int main() {
MinStack s;
int Q;
scanf("%d", &Q);
while (Q--) {
int a, b;
scanf("%d", &a);
switch (a) {
case 0:
printf("%d\n", s.min());
break;
case 1:
scanf("%d", &b);
s.push(b);
break;
case 2:
printf("%d\n", s.pop());
break;
}
}
return 0;
}
京公网安备 11010502036488号