题目:
设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。
实现 FreqStack 类:
FreqStack() 构造一个空的堆栈。
void push(int val) 将一个整数 val 压入栈顶。
int pop() 删除并返回堆栈中出现频率最高的元素。
如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。
Method1:双哈希表
首先,我们很容易想到建立一个哈希表cnts记录某个值的出现频率,也即是cnts[val]=c,c代表val值在栈中的出现次数。
其次:题目要求每一次pop需要返回频率最大的元素,若有多个则返回栈顶的一个的要求,我们考虑建立第二个哈希表,该哈希表有出现的次数c为键值,以出现次数都为c的元素序列为其值,map[c]=A=[...],含义为出现次数为c的序列A,并且A序列中的最后一个元素代表最接近栈顶的元素。
最后我们使用一个变量manf记录当前出现的最大频数。
代码:
class FreqStack {
public:
FreqStack() {
maxf=0;
}
void push(int val) {
cnts[val]++;
group[cnts[val]].push(val);
maxf=max(maxf,c