• 力扣 895. 最大频率栈


    题目

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

    实现 FreqStack 类:

    FreqStack() 构造一个空的堆栈。
    void push(int val) 将一个整数 val 压入栈顶。
    int 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]
    解释:
    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]。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/maximum-frequency-stack
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    方法1:哈希表
    • 哈希表Map cnts:存【数,数出现的次数】。
    • 哈希表 Map map;:存【出现的次数c,出现次数为c的元素列表】。
    • 变量int max:当前出现次数最大值。
    • 序列中的结尾元素为出现次数为 c 的所有元素中最靠近栈顶的元素。
    • 当我们在某次 pop 操作后发现出现次数为 max 的集合为空时,对 max 进行自减操作即可。
    Java实现
    class FreqStack {
        Map<Integer, Integer> cnts;
        Map<Integer, List<Integer>> map;
        int max;
        public FreqStack() {
            cnts = new HashMap<>();
            map = new HashMap<>();
        }
        
        public void push(int val) {
            cnts.put(val, cnts.getOrDefault(val, 0) + 1);
            int c = cnts.get(val);
            List<Integer> list = map.getOrDefault(c, new ArrayList<>());
            list.add(val);
            map.put(c, list);
            max = Math.max(max, c);
        }
        
        public int pop() {
            List<Integer> list = map.get(max);
            int ans = list.remove(list.size() - 1);
            cnts.put(ans, cnts.get(ans) - 1);
            if (list.size() == 0) max--;
            return ans;
        }
    }
    
    • 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

    在这里插入图片描述

  • 相关阅读:
    2022/6/27 Quartz(定时任务)讲解+入门案例
    基于ADB Shell 实现的 Android TV、电视盒子万能遥控器 — ADB Remote ATV
    渗透测试-命令执行漏洞
    2022届计算机毕业论文(设计)学生选题参考合集推荐收藏
    Iterator 和 ListIterator 的区别(简要说明)
    GEE学习笔记003-访问asset文件
    JWT+shiro+redis整合
    02-《人月神话》霍金敬酒和虫族战争-中译本纠错及联想
    谷歌广告推广效果不佳的原因
    txt简谱制作器上线(个人java程序)
  • 原文地址:https://blog.csdn.net/qq_42467009/article/details/128151768