图解LeetCode——895. 最大频率栈(难度:困难)

news2024/11/27 14:42:17

一、题目

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

实现 FreqStack 类:

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

二、示例

2.1> 示例 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 <= 10^9
  • push 和 pop 的操作数不大于 2 * 10^4
  • 输入保证在调用 pop 之前堆栈中至少有一个元素。

三、解题思路

根据题目描述,我们需要解决两个问题:

问题1】如何保存某个数字出现次数?——采用Map<Integer, Integer> map维护
问题2】如何保存相同出现次数情况下,多个数字集合的“入栈”和“出栈”顺序?——采用LinkedList[] st维护

我们以示例1为例,来看一下对于插入操作,是如何处理的:

【解释】
push(5) :在map中{key=5, value=1};在st中{key=1, value=[5]};
push(7) :在map中{key=5, value=1},{key=7, value=1};在st中{key=1, value=[5, 7]};
push(5) :在map中{key=5, value=2},{key=7, value=1};在st中{key=1, value=[5, 7]}, {key=2,value=[5]};
push(7) :在map中{key=5, value=2},{key=7, value=2};在st中{key=1, value=[5, 7]}, {key=2,value=[5, 7]};
push(4) :在map中{key=5, value=2},{key=7, value=2},{key=4, value=1};在st中{key=1, value=[5, 7, 4]}, {key=2,value=[5, 7]};
push(5) :在map中{key=5, value=3},{key=7, value=2},{key=4, value=1};在st中{key=1, value=[5, 7, 4]}, {key=2,value=[5, 7]}, {key=3,value=[5]};

我们还是以示例1为例,来看一下对于出栈操作,是如何处理的:

【解释】由于当前最大出现次数max等于3,所以,我们可以通过st[3]获得数字集合为:[5]将5出栈之后,数字集合变为[],因此max减1等于2,并且将map数字5的出现次数减1,即:3-1=2

我们再次执行出栈操作,再来看一下是如何处理的:

【解释】由于当前最大出现次数max等于2,所以,我们可以通过st[2]获得数字集合为:[5,7]将7出栈之后,数字集合变为[5],由于数字集合不为空,所以max依然等于2,然后将map数字7的出现次数减1,即:2-1=1

后续的出栈操作,以此类推,此处就不再赘述了。

四、代码实现

class FreqStack {
    Map<Integer, Integer> map = new HashMap(); // key:数字N  value:数字N出现的次数
    LinkedList<Integer>[] st = new LinkedList[2 * (int) 1e4]; // key:出现M次 value:出现M次的数字集合
    int max = 0; // 当前最大出现次数

    public FreqStack() {}

    public void push(int val) {
        int times = map.getOrDefault(val, 0) + 1; // 数字val的出现次数+1
        map.put(val, times);
        if (st[times] == null) st[times] = new LinkedList();
        st[times].add(val); // 将数字val放到以times为key的value集合中
        max = Math.max(max, times); // 尝试更新最大出现次数
    }

    public int pop() {
        int result = -1; // 待出栈数字
        while (max > 0) {
            if (st[max].size() == 0) max--; // 如果max次数对应的数字集合都已经出栈了,则max减1
            else {
                result = st[max].removeLast(); // 移除出现times次的数字集合中“末尾”的数字result
                break;
            }
        }
        map.put(result, map.getOrDefault(result, 0) - 1); // 将数字result的出现次数-1
        return result;
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/47825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

圣杯与双飞翼布局,clip-path,列表与生成元素,计数器

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录圣杯与双飞翼布局clip属性clip-path属性例子&#xff08;不同区域使用不同颜色的导航&#xff09…

【MySQL 18】Docker 安装 MySQL8 .0.30

1、查看可用的 MySQL 版本 访问 MySQL 镜像库地址&#xff1a; https://hub.docker.com/_/mysql?tabtags 。2、拉取 MySQL 8.0.30 镜像 拉取官方的指定版本的镜像&#xff1a; docker pull mysql:8.0.30[rootlocalhost deploy]# docker pull mysql:8.0.30 8.0.30: Pulling…

Gly-Gly-Arg, 54944-27-3/55033-48-2

贻贝信息素的模拟物&#xff0c;诱导各种贻贝物种的聚集&#xff0c;如绒螯虾。GGR还能刺激浮游生物幼虫定居。 编号: 401458中文名称: Gly-Gly-Arg英文名: Gly-Gly-ArgCAS号: 54944-27-3/55033-48-2单字母: H2N-GGR-OH三字母: H2N-Gly-Gly-Arg-COOH氨基酸个数: 3分子式: C10H2…

【C语言初阶(NEW)】五、操作符详解(二)|隐式类型转换|算术转换|操作符的属性

目录 一、表达式求值 1.1 隐式类型转换 1.1.1 什么是整型提升&#xff08;整型提升&#xff09; 1.1.2 整型提升的意义 1.1.3 有符号&#xff08;signed&#xff09;与无符号&#xff08;unsigned&#xff09;的区别 1.1.4 有符号&#xff08;signed&#xff09;类型的整…

Redis学习笔记②实战篇_黑马点评项目

若文章内容或图片失效&#xff0c;请留言反馈。部分素材来自网络&#xff0c;若不小心影响到您的利益&#xff0c;请联系博主删除。 资料链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA&#xff08;提取码&#xff1a;eh11&#xff09;在线视频&#xff1a;…

知道创宇ScanA免费试用|守护网络空间内容安全生命线

《淮南子说山训》中有言&#xff0c;“众曲不容直&#xff0c;众枉不容正&#xff0c;故……众议成林&#xff0c;无翼而飞&#xff0c;三人成市虎”。随着互联网社交、即时通讯工具等社交媒体的蓬勃发展&#xff0c;大众发布、传播和获取信息的方式更加简便、渠道更为广泛。也…

安科瑞 ARCM300-Z-4G 导轨式智慧用电监控装置 猪舍无线火灾探测器

安科瑞 王晶淼/刘芳 1 概述 智慧用电在线监控装置是针对 0.4kV 以下的 TT、TN 系统设计的智能电力装置&#xff0c;具有单、三相交流电测量、四象限电能计量、谐波分析、遥信输入、遥信输出功能&#xff0c;以及 RS485 通讯或 GPRS 无线通讯功能&#xff0c;通过对配电回路的剩…

YOLO V5 详解

YOLO V5 Backbone SPPF SPP 是使用了3个kernel size不一样大的pooling 并行运算。SPPF是将kernel size为5的 pooling 串行运算&#xff0c;这样的运算的效果和SPP相同&#xff0c;但是运算速度加快。因为SPPF减少了重复的运算&#xff0c;每一次的pooling 运算都是在上一次运…

IP-guard产品相关端口和服务名称

数据库 SQL Server (SQLEXPRESS) 服务器 OCULAR V3 SERVER 中继器 OCULAR V3 MIDTIER SERVER 客户端 WINDOWS HELPER SERVICE 报表 OCULAR V3 REPORT SERVER web服务器 Ocular web server,OCULAR Console Web Service 云备份服务器 OCULAR File Cloud Backup Server,OCULAR Fil…

Java——迷你图书管理器(JDBC+MySQL+Apache DBUtils)

​ ✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;乐趣国学的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例…

沉睡者IT - Web3的未来在哪里?

欢迎关注沉睡者IT&#xff0c;点上面关注我 ↑ ↑ 专家说&#xff0c;web3将颠覆现在的互联网 今天我们来讨论一下&#xff0c;web3会颠覆现在的互联网呢&#xff1f; 看了小编往期的作品你应该知道&#xff0c;如果同样的作品发在web3平台上&#xff0c;你将获取到收益。 那…

【笔试强训】Day 5

&#x1f308;欢迎来到笔试强训专栏 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x…

强化学习泛化性 综述论文阅读 A SURVEY OF GENERALISATION IN DEEP REINFORCEMENT LEARNING

强化学习泛化性 综述论文阅读摘要一、介绍二、相关工作&#xff1a;强化学习子领域的survey三、强化学习中的泛化的形式3.1 监督学习中泛化性3.2 强化学习泛化性背景3.3 上下文马尔可夫决策过程3.4 训练和测试上下文3.6 应用实例3.7 更可行泛化的其他假设3.8 备注和讨论4. 强化…

SSM整合

整合的思路是&#xff1a; 先创建spring框架 通过spring整合spring mvc 通过spring整合mybatis 工程创建 创建Maven工程–>create for archtype–>webapp 创建项目结构 在recourses目录下创建 dbconfig.properties、log4j.properties、mysqlConfig.xml、springmvc.xml、…

css3实现一个3d楼梯动画

背景 &#x1f44f;&#x1f44f;通过给出的宽/高个数&#xff0c;用css3的transform以及transform-style快速的实现一个3d楼梯&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义css变量&#xff1a;宽w、高…

cadence SPB17.4 - allegro - disable recent Designs list

文章目录cadence SPB17.4 - allegro - disable recent Designs list概述笔记效果备注ENDcadence SPB17.4 - allegro - disable recent Designs list 概述 和csdn同学讨论问题, 他的问题如下: cadence如何在不去掉startpage的情况下只Recent Projects呢&#xff1f;&#xff…

【能效管理】变电站综合自动化监控系统在35kV变电站中应用

摘要&#xff1a;Acrel-1000变电站综合自动化系统&#xff0c;是我司根据电力系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能&#xff0c;可实现无人…

Lakehouse架构指南

什么是数据湖&#xff0c;为什么需要数据湖&#xff1f; 数据湖是一种存储系统&#xff0c;具有底层数据湖文件格式及其不同的数据湖表格式&#xff0c;可存储大量非结构化和半结构化数据&#xff0c;并按原样存储&#xff0c;但没有特定用途。广泛的技术和非技术数据消费者可…

第10讲:Python列表对象查操作之通过切片获取列表中的元素

文章目录1.切片获取列表中的技术要点1.1切片获取列表中的概念总结1.2.切片的语法格式以及含义3.使用切片方法获取列表中元素3.1.定义一个原始列表列表3.2.当step步长为正数时切片的案例3.3.当step步长为负数时切片的案例3.4.使用负数索引作为切片范围4.将切片后的列表赋值给新的…

【收藏】安科瑞企业微电网能效管理系统云平台演示账号

安科瑞 李亚俊 Acrel8757 1、AcrelCloud-1000变电所电力运维云平台 网址&#xff1a;https://acrelcloud.cn/ 演示账号&#xff1a;acrel 密码:123456 2、SCADA电力监控系统 网址&#xff1a;http://scada.acrel-eem.com/ 演示账号&#xff1a;acrel 密码:…