Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
OK用两个栈,但是如果不优化一下空间,会MLE
所以在记录最小值的那个栈时,记录下它的位置和大小,类似于链表的实现,AC
class MinStack {
public:
int stack[70000];
int min_val[10000];
int min_key[10000];
int stack_top=-1;
int min_top=-1;
void push(int x) {
stack[++stack_top] = x;
if(min_top==-1){
min_val[++min_top] = x;
min_key[min_top] = stack_top;
}else{
if(x<min_val[min_top]){
min_key[++min_top] = stack_top;
min_val[min_top] = x;
}
}
}
void pop() {
stack_top--;
if(min_key[min_top]>stack_top)
min_top--;
}
int top() {
return stack[stack_top];
}
int getMin() {
return min_val[min_top];
}
};