• LeetCode 0895. 最大频率栈


    【LetMeFly】895.最大频率栈

    力扣题目链接:https://leetcode.cn/problems/maximum-frequency-stack/

    设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。

    实现 FreqStack 类:

    • FreqStack() 构造一个空的堆栈。
    • void push(int val) 将一个整数 val 压入栈顶。
    • int pop() 删除并返回堆栈中出现频率最高的元素。
      • 如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。

     

    示例 1:

    输入:
    ["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]
    解释:
    FreqStack = new FreqStack();
    freqStack.push (5);//堆栈为 [5]
    freqStack.push (7);//堆栈是 [5,7]
    freqStack.push (5);//堆栈是 [5,7,5]
    freqStack.push (7);//堆栈是 [5,7,5,7]
    freqStack.push (4);//堆栈是 [5,7,5,7,4]
    freqStack.push (5);//堆栈是 [5,7,5,7,4,5]
    freqStack.pop ();//返回 5 ,因为 5 出现频率最高。堆栈变成 [5,7,5,7,4]。
    freqStack.pop ();//返回 7 ,因为 5 和 7 出现频率最高,但7最接近顶部。堆栈变成 [5,7,5,4]。
    freqStack.pop ();//返回 5 ,因为 5 出现频率最高。堆栈变成 [5,7,4]。
    freqStack.pop ();//返回 4 ,因为 4, 5 和 7 出现频率最高,但 4 是最接近顶部的。堆栈变成 [5,7]。

     

    提示:

    • 0 <= val <= 109
    • push 和 pop 的操作数不大于 2 * 104
    • 输入保证在调用 pop 之前堆栈中至少有一个元素。

    方法一:哈希表设计

    其实主要也就是两个数据结构,一个是intint的哈希表,一个是intstack的哈希表

    • unordered_map value2times记录一个数值出现的次数。假如value2times[1] = 5,那么就说明栈中有51
    • unordered_map> times2values记录某个频率的数。假如times2values[3] = [1, 2, 5,那么就说明125都出现过3

    最后,我们再使用一个整数类型的数据maxTimes来记录整个栈中的“最大频率”

    当元素入栈时:

    假设入栈了元素val,那么val在栈中出现的次数增加(value2times[val]++

    出现次数增加后,这个元素出现了value2times[val]次(记为thisTimes

    那么我们同时就需要将这个元素插入times2values[thisTimes]这个栈中

    最后,更新整个栈中的最大频率maxTimes即可

    当元素出栈时:

    通过maxTimes我们可以得到栈中元素的“最大出现次数”

    因此,value2times[maxTimes]栈的栈顶元素记为要找的元素。(记为value

    将这个元素弹出栈,并将这个元素在栈中的出现次数减一。

    如果出栈后maxTimes对应的栈空了,那么就将maxTimes减1

    • 时间复杂度 O ( 1 ) O(1) O(1),单次入栈和出栈的时间复杂度都是 O ( 1 ) O(1) O(1)
    • 空间复杂度 O ( n ) O(n) O(n),其中 n n n是栈中的最大元素个数

    AC代码

    C++
    class FreqStack {
    private:
        unordered_map<int, int> value2times;
        unordered_map<int, stack<int>> times2values;
        int maxTimes;
    public:
        FreqStack() {
            maxTimes = 0;
        }
        
        void push(int val) {
            value2times[val]++;
            int thisTimes = value2times[val];
            times2values[thisTimes].push(val);
            maxTimes = max(maxTimes, thisTimes);
        }
        
        int pop() {
            int value = times2values[maxTimes].top();
            times2values[maxTimes].pop();
            value2times[value]--;
            if (times2values[maxTimes].empty()) {
                maxTimes--;
            }
            return value;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    同步发文于CSDN,原创不易,转载请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/128124298

  • 相关阅读:
    关于this
    力扣-排序算法
    Redis数据的持久化
    喜讯 | 怿星科技获评SAE“优秀核心零部件企业”,测试软件平台工具广受赞誉
    2022-09-17青少年软件编程(C语言)等级考试试卷(五级)解析
    QTcpServer 封装
    KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解 --》你的所有疑惑在本文都能得到解答
    基于SE-YOLOv5s的绝缘子检测
    实际应用效果不佳?来看看提升深度神经网络泛化能力的核心技术(附代码)
    数据结构--排序(1)
  • 原文地址:https://blog.csdn.net/Tisfy/article/details/128124298