题解:
考察点: 栈
易错点:
本题要求、
、
三种操作都在
复杂度内完成,也就是说都必须在常数时间内完成,其中
和
都是栈本来的操作,很多同学会考虑使用堆来维护最小值,但是这是不对的,因为堆每次找最小值的时间复杂度为
题解:
可以考虑使用两个栈来共同维护,一个栈用来进行元素常规的出栈和入栈操作,另一个栈
维护最小值,其中栈顶元素表示当前栈中的最小值。对于入栈操作,首先将
入栈
,如果
比
中的栈顶元素小,或者
为空,则将
加入
中。对于
操作,直接取栈
中的栈顶元素。对于出栈操作,栈
直接出栈,如果当前栈顶元素等于
的栈顶元素,则把
的栈顶出栈
#include "bits/stdc++.h"
using namespace std;
stack<int>s;
stack<int>Min;
void Push(int x){
s.push(x);
if(Min.empty()) Min.push(x);
else{
int tmp=Min.top();
if(x<=tmp) Min.push(x);
}
}
int GetMin(){
return Min.top();
}
int Pop(){
int tmp=s.top(); s.pop();
if(tmp==Min.top()&&!Min.empty()) Min.pop();
return tmp;
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--){
int op;
scanf("%d",&op);
if(op==0){
printf("%d\n",GetMin());
}else if(op==1){
int x; scanf("%d",&x);
Push(x);
}else{
printf("%d\n",Pop());
}
}
return 0;
} 
京公网安备 11010502036488号