zoukankan      html  css  js  c++  java
  • [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;
    };
    
  • 相关阅读:
    python笔试题(3)
    跨域资源共享 CORS 详解
    RequestDispatcher接口include方法
    清除浮动的四种方式及其原理理解
    css---vw布局来适应移动端【解决rem的bug】
    golang 实现简单的rsa加密算法
    golang 查找素数
    JAVA大文件上传支持分片上传
    JSP大文件上传支持切割上传
    JSP大文件上传支持分场上传
  • 原文地址:https://www.cnblogs.com/adamwong/p/10566612.html
Copyright © 2011-2022 走看看