题目名称:设计getMin功能的栈
题目地址:传送门
题解
用两个容器,一个顺序容器,使用数组;一个关联容器,使用map。
用数组构造栈,用于Push和Pop。每Push一个元素进去,map中关键字对应的值加1(若map中没有此关键字,创建该键值对)。每Pop一个元素,map中冠电子对应的值减1(若map中此关键字的值减为0,删除该键值对)。
每次GetMin,输出map中第一个键值对的关键字。
Push, Pop代价O(logN)
GetMin代价O(1)
#include <iostream>
#include <map>
#define MAXN 1000010
using namespace std;
int Stack[MAXN], idx = 0;
map<int, int> mp;
void Push(int X)
{
Stack[idx++] = X;
if(mp.find(X) == mp.end())
{
mp[X] = 1;
}
else
{
++mp[X];
}
}
void Pop()
{
if(idx == 0) return;
--idx;
if(mp[Stack[idx]] == 1)
{
mp.erase(Stack[idx]);
}
else
{
--mp[Stack[idx]];
}
}
void GetMin()
{
cout<<mp.begin()->first<<endl;
}
int main()
{
ios::sync_with_stdio(false);
int N, X;
string s;
cin>>N;
while(N--)
{
cin>>s;
if(s[0] == 'p')
{
if(s == "push")
{
cin>>X;
Push(X);
}
else
{
Pop();
}
}
else
{
GetMin();
}
}
return 0;
}