【895. 最大频率栈】

news2024/11/25 6:30:43

来源:力扣(LeetCode)

描述:

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

实现 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 之前堆栈中至少有一个元素。

方法:哈希表和栈

思路与算法

  在本题中,每次需要优先弹出频率最大的元素,如果频率最大元素有多个,则优先弹出靠近栈顶的元素。因此,我们可以考虑将栈序列分解为多个频率不同的栈序列,每个栈维护同一频率的元素。当元素入栈时频率增加,将元素加入到更高频率的栈中,低频率栈中的元素不需要出栈。当元素出栈时,将频率最高的栈的栈顶元素出栈即可。

  更详细的,我们用一个哈希表 freq 来记录每个元素出现的次数。设当前最大频率为 maxFreq ,为 1 ∼ maxFreq 中的每种频率单独设置一个栈。为了方便描述,记 freq[x] 为 x 的频率,group[i] 为频率为 i 的栈。

  1. 当元素 x 入栈时,令 freq[x] + 1,然后将 x 放入 group[freq[x]] 中,更新 maxFreq = max⁡(maxFreq,freq[x])。此时,group[1] ∼ group[maxFreq] 的每一个栈中都包含 x。
  2. 元素出栈时,获取 x = group[maxFreq].top() 作为出栈元素,令 freq[x] − 1,若 x 出栈后 group[maxFreq] 为空,则令 maxFreq − 1。

代码:

class FreqStack {
public:
    FreqStack() {
        maxFreq = 0;
    }

    void push(int val) {
        freq[val]++;
        group[freq[val]].push(val);
        maxFreq = max(maxFreq, freq[val]);
    }

    int pop() {
        int val = group[maxFreq].top();
        freq[val]--;
        group[maxFreq].pop();
        if (group[maxFreq].empty()) {
            maxFreq--;
        }
        return val;
    }

private:
    unordered_map<int, int> freq;
    unordered_map<int, stack<int>> group;
    int maxFreq;
};

1

复杂度分析
时间复杂度:对于 push 和 pop 操作,时间复杂度为 O(1)。
空间复杂度: O(n),其中 n 是 FreqStack 中元素的个数。
author:力扣官方题解

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

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

相关文章

MySQL索引的底层数据结构原理剖析(二叉树、 红黑树、Hash、B-Tree、B+Tree)

一. 前言 1. 说明 我们平时所说的&#xff1a;聚集索引(主键索引)&#xff0c;次要索引&#xff0c;覆盖索引&#xff0c;复合索引&#xff0c;前缀索引&#xff0c;唯一索引在MySQL5.7和 8.0版本默认都是使用BTree索引&#xff0c;除此之外还有 Hash索引。至于MySQL5.7之前版…

Go-Excelize API源码阅读(三十八)——SetCellStyle

Go-Excelize API源码阅读&#xff08;三十八&#xff09;——SetCellStyle 开源摘星计划&#xff08;WeOpen Star&#xff09; 是由腾源会 2022 年推出的全新项目&#xff0c;旨在为开源人提供成长激励&#xff0c;为开源项目提供成长支持&#xff0c;助力开发者更好地了解开源…

智慧城市运营中心建设方案(SCOC)智慧城市的心脏

一、大数据&#xff1a;智慧城市的基础与引擎 中国每天正以消失100个村庄的速度快速步入城镇化&#xff0c;未来10年内将有5亿以上的人涌入城市。这无疑会给城市的建设带来巨大的压力&#xff0c;城市资源有限&#xff0c;规模不可能无限扩张&#xff0c;城市在就业、教育、住房…

【数据库基础】数据库介绍和三大范式

数据库简介&#x1f33e;第一章 数据库简介&#x1f54a;️1.1 简介&#x1f54a;️1.2 常见数据库管理系统&#x1f54a;️1.3 三大范式&#xff08;规范&#xff09;&#x1f375;第一范式&#xff1a;&#x1f375;第二范式:&#x1f375;第三范式&#x1f33e;第一章 数据库…

实用调试技巧

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 目录什么是bug&#xff1f;调试是什么&#xff1f;有多重要&#xff1f;调试是什么调试的基本步骤debug和release的介绍windows环境调试介绍快捷键调试的时候查看程序当前…

基于51单片机六车道智能交通灯设计(仿真+源程序+PCB+论文)

资料编号&#xff1a;204 功能介绍&#xff1a;&#xff08;全套毕设资料齐全&#xff09; 本设计的交通灯以十字路口为模型&#xff0c;在实现基本的功能前提下增加了时间及温度的液晶显示。从而还增加了路口高峰期的智能化人工管理机制。 实际生活中交通信号灯的规则千变万…

C++ 大作业/课程设计 小型公司工资管理软件

小型公司工资管理软件一、实验目的二、实验要求三、项目分工四、软件设计0.效果图&#xff1a;1.类的继承关系2.类的设计3.程序运行流程4.异常处理1. 用户输入异常2.文件操作异常五、程序代码一、实验目的 熟悉面向对象程序设计思想&#xff0c;掌握类、类的派生、静态成员、多…

JVM之运行时数据区 方法区

JVM方法区概述设置方法区的大小参数如何解决这些OOM内部结构补充non-final的类变量全局变量&#xff1a;static final常量池运行时常量池方法区的演进StringTable为什么要调整&#xff1f;方法区垃圾回收总览概述 《java虚拟机规范》中明确说明&#xff1a;“尽管所有的方法区…

Tableau可视化项目

文章目录Tableau可视化项目一、数据来源二、项目介绍1.项目目的2.架构三、数据可视化1.人口1.1 总人口、城镇人口、乡村人口1.2 人口出生率、死亡率、自然增长率1.3 人口年龄结构1.4 男女比例2.居民生活水平2.1 医疗情况2.2 恩格尔系数2.3 人均消费支出3.经济3.1 能源弹性系数3…

matlab中图像分割技术之一边缘检测

1.边缘检测 &#xff08;1&#xff09;Roberts边缘算子 (2)Sobel算子 (3)Prewitt算子 (4)拉普拉斯&#xff08;Laplacian&#xff09;算子 (5)LOG&#xff08;Laplacian-Gauss&#xff09;算子 &#xff08;6)坎尼&#xff08;Canny&#xff09;算子 &#xff08;7&#xff09;…

数仓搭建-DWD层

DWD层&#xff08;用户行为日志&#xff09; 6.1.1 日志解析思路 1&#xff09;日志结构回顾 &#xff08;1&#xff09;页面埋点日志 &#xff08;2&#xff09;启动日志 2&#xff09;日志解析思路 6.1.2 get_json_object函数使用 1&#xff09;数据 [{"name&qu…

力扣(LeetCode)128. 最长连续序列(C++)

哈希集合 建立哈希集合&#xff0c;存入所有数。一次遍历数组&#xff0c;对每个数检查是否有前一个数&#xff0c;如果某个数没有前一个数&#xff0c;说明这个数是一个序列的起点&#xff0c;从这个数开始遍历得到序列长度&#xff0c;维护最大序列长度&#xff0c;即是本题…

【SpringBoot项目中Knife4j在线API文档】

目录 1. Knife4j在线API文档基本使用 2. 配置API文档信息 1. Knife4j在线API文档基本使用 Knife4j是一款基于Swagger 2的在线API文档框架。 使用Knife4j的基础步骤&#xff1a; 添加依赖在application.properties / application.yml中添加配置在项目中添加配置类关于依赖项…

甲烷排放通量的计算

甲烷或N2O的排放通量计算公式如下&#xff1a; 式 (1) 中, F为CH4 (以C计) 或N2O (以N计) 排放通量, mgm-2h-1或μgm-2h-1;ρ为标准状况下CH4或N2O的密度, 分别为0.54和1.25 gL-1;V为采样箱体积, m3;A为采样底座内土壤表面积, m2;ΔCΔtΔCΔt表示CH4或N2O的排放速率, μLL-1h-…

浅谈正则表达式——C++正则替换引起的性能下降

目录问题引入正则替换测试常规方法测试模拟外部多次调用正则性能差的原因写在最后问题引入 最近在一次解析大文件(10万行)时&#xff0c;处理空格用到了正则替换&#xff0c;却没想到带来了性能上的问题&#xff0c;特别在此记录给需要的人避坑。假如要用C处理一个字符串首尾的…

4-four: 我收到的赞

我收到的赞 重构点赞功能&#xff08;用上节的功能较为麻烦&#xff0c;需要将用户发布的帖子和评论所获得的赞加起来&#xff09; 以用户为key&#xff0c;记录点赞数量increment(key), decrement(key)。 开发个人主页 以用户为key&#xff0c;查询点赞数量 1.在Redis.Ut…

RabbitMQ------其他知识点(幂等性、优先级队列、惰性队列)(九)

RabbitMQ------其他知识点&#xff08;&#xff09;&#xff08;九&#xff09; 幂等性 用户对于统一操作发起的一次请求或者多次请求的结果是一致的&#xff0c;不会因为多次点击而产生副作用。同一次还款&#xff0c;通过多次点击不会生成多条还款记录&#xff0c;一个人的…

crm客户管理系统为企业带来的价值

简道云CRM场景套件对中小企业来说&#xff0c;crm客户管理系统最核心的作用&#xff0c;一是客户信息(联系信息和洽谈过程&#xff09;的存留&#xff0c;不会因为业务人员的离职造成流失&#xff0c;这点对老板很重要。二是可帮助业务人员&#xff08;客户获取、主管指导等&am…

Win32API操作文件

在Windows编程中CreateFile函数是用得非常多的&#xff0c;不仅可以打开文件&#xff0c;还可以打开管道、邮槽、通信资源、磁盘设备&#xff08;早期Windows)&#xff0c;控制台、目录。该函数返回一个句柄&#xff0c;该句柄可用于根据文件或设备以及指定的标志和属性访问文件…

SpringSecurity(二十)---OAuth2:实现资源服务器(上)资源服务器搭建以及直接调用授权服务器模式

一、 前言 本章将讨论如何使用Spring Security实现一个资源服务器&#xff0c;资源服务器是管理用户资源的组件。另外&#xff0c;学习本章有个前提&#xff0c;需要先把前面搭建授权服务器的相关文章先给阅读&#xff0c;否则可能后面出现的授权服务器相关代码不知道个所以然…