实现 FreqStack
,模拟相似栈的数据结构的操做的一个类。shell
FreqStack
有两个函数:数据结构
push(int x)
,将整数 x
推入栈中。pop()
,它移除并返回栈中出现最频繁的元素。
示例:函数
输入: ["FreqStack","push","push","push","push","push","push","pop","pop","pop","pop"], [[],[5],[7],[5],[7],[4],[5],[],[],[],[]] 输出:[null,null,null,null,null,null,null,5,7,5,4] 解释: 执行六次 .push 操做后,栈自底向上为 [5,7,5,7,4,5]。而后: pop() -> 返回 5,由于 5 是出现频率最高的。 栈变成 [5,7,5,7,4]。 pop() -> 返回 7,由于 5 和 7 都是频率最高的,但 7 最接近栈顶。 栈变成 [5,7,5,4]。 pop() -> 返回 5 。 栈变成 [5,7,4]。 pop() -> 返回 4 。 栈变成 [5,7]。
这道题目我使用了两个哈希表:code
Freq
用来统计数字出现的次数: integer
->unsigned
io
FreqStack
用来统计出现次数所对应的栈:unsigned
->stack<int>
class
主要的解法是为每次出现第几回的元素建一个栈,好比map
1,3,4,5,1,1,
统计
那么1,3,4,5
就会在FreqStack[1]
上由于他们的出现次数为1数据
而第二次出现的1
就会压入FreqStack[2]
,第三次出现的1
会出如今FreqStack[3]
,以此类推。top
在Freq
哈希表的辅助下,判断出现次数会至关容易。AC代码以下
class FreqStack { public: void push(int x) { Freq[x]++; maxfreq = max(Freq[x], maxfreq); FreqStack[Freq[x]].push(x); } int pop() { int x = FreqStack[maxfreq].top(); FreqStack[maxfreq].pop(); if(FreqStack[Freq[x]].empty()) maxfreq--; Freq[x]--; return x; } private: unordered_map<int, unsigned> Freq; unordered_map<unsigned, stack<int>> FreqStack; unsigned maxfreq = 0; };