實現 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; };