• [Leetcode]895.最大频率栈


    Problem

    实现 FreqStack,模拟类似栈的数据结构的操作的一个类。

    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

    这道题目我使用了两个哈希表:

    Freq用来统计数字出现的次数: integer->unsigned

    FreqStack用来统计出现次数所对应的栈:unsigned->stack<int>

    主要的解法是为每次出现第几次的元素建一个栈,比如

    1,3,4,5,1,1,

    那么1,3,4,5就会在FreqStack[1]上因为他们的出现次数为1

    而第二次出现的1就会压入FreqStack[2],第三次出现的1会出现在FreqStack[3],以此类推。

    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;
    };
    
  • 相关阅读:
    (轻松一刻)神秘而又强大的蓝翔学院!而且还是当中最可怕的挖掘机系!
    IIS 反向代理二级目录及泛目录
    正则表达式匹配外链和内链
    关于 preg_replace_callbank 的学习记录
    Linux 笔记
    Linux 笔记
    Linux 笔记
    使用 Docker 安装 showdoc
    Docker 入门
    Linux 笔记
  • 原文地址:https://www.cnblogs.com/adamwong/p/10566612.html
Copyright © 2020-2023  润新知