[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;
};
相关文章
相关标签/搜索