[Leetcode]895.最大頻率棧

Problem

實現 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]。

Solution

這道題目我使用了兩個哈希表:code

Freq用來統計數字出現的次數: integer->unsignedio

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;
};
相關文章
相關標籤/搜索