LeetCode 895. Maximum Frequency Stack
题目链接:https://leetcode.com/problems/maximum-frequency-stack/
题意:实现一种数据结构FreqStack,FreqStack需要实现两个功能:
- push(int x) : 将x放入栈中
- pop(): 移除并返回栈中出现次数最多的元素,若果该元素不唯一,返回离栈顶最近的
思路:维护一个set,set中存储元素值,以及一个包含该元素在原栈中的出现次序的栈,排序先按照set中栈的大小排序,栈大小相同则按照栈顶元素大小排序。push若该元素不在set中,则直接插入,否则找到该元素,往栈中加入一个新次序。pop时只需弹出set的起始位置栈中的第一个元素。为了便于push时找到该元素,使用unordered_map记录元素在set中的位置。时间复杂度$O(log n)$
- class FreqStack {
- public:
- struct P {
- int data; //存储入栈的元素,相同的元素在一起
- stack< int > q; //存储元素的插入顺序
- bool operator < (const P &a) const {
- if (q.size() != a.q.size()) //先按元素个数排序
- return q.size() > a.q.size();
- return q.top() > a.q.top(); //再按离栈顶顺序排序
- }
- P(int x) {
- data = x;
- }
- };
- set<P> s;
- int cnt = 0;
- unordered_map<int, set<P>::iterator > mp; //存储元素在set中的位置
- void push(int x) {
- P a(x);
- cnt++; //cnt表示入栈时间
- if (mp.find(x) != mp.end()) { //元素在set中已经存在
- cnt++;
- a = *mp[x];
- s.erase(mp[x]);
- }
- a.q.push(cnt);
- s.insert(a);
- mp[x] = s.find(a);
- }
- int pop() {
- P a = *s.begin(); //set中第一个
- mp.erase(a.data);
- s.erase(s.begin());
- a.q.pop();
- if (a.q.size() > 0) {
- s.insert(a);
- mp[a.data] = s.find(a);
- }
- return a.data;
- }
- };
官方的思路比较巧妙,复杂度$O(1)$:
维护两个hash表time<int, int>和mp<int, stack<int> >以及一个max_time,time[i]记录元素i出现的次数,mp[i]记录出现次数>=i次的元素,按照出现次序入栈,max_time记录当前出现次数最多元素的次数。
push(i)时time[i]++且更新max_time,pop时将出现次数为max_time的栈中第一个元素出栈,并更新max_time
- class FreqStack {
- public:
- void push(int x) {
- time[x]++;
- if(time[x]>max_time)
- max_time=time[x];
- mp[time[x]].push(x); //将x出现次数加入对应的堆栈中
- }
- int pop() {
- int z = mp[max_time].top(); //出现最多次数的栈顶元素
- mp[max_time].pop();
- if(mp[max_time].empty()) //更新max_time
- max_time--;
- time[z]--;
- return z;
- }
- private:
- unordered_map<int,int> time; //元素出现的次数
- unordered_map<int,stack<int> > mp; //出现次数对应的元素
- int max_time=0;
- };
LeetCode 895. Maximum Frequency Stack的更多相关文章
- [LeetCode] 895. Maximum Frequency Stack 最大频率栈
Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...
- 【LeetCode】895. Maximum Frequency Stack 解题报告(Python)
[LeetCode]895. Maximum Frequency Stack 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxueming ...
- LeetCode - Maximum Frequency Stack
Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...
- [Swift]LeetCode895. 最大频率栈 | Maximum Frequency Stack
Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...
- 最大频率栈 Maximum Frequency Stack
2018-10-06 22:01:11 问题描述: 问题求解: 为每个频率创建一个栈即可. class FreqStack { Map<Integer, Integer> map; Lis ...
- Maximum Frequency Stack
Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...
- Uncaught RangeError: Maximum call stack size exceeded 调试日记
异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 开发道路上不是解决问题最重要,而是解决问题的过程,这个过程我们称之为~~~调试 记 ...
- Uncaught RangeError: Maximum call stack size exceeded 超出最大调用值(个人解释)
写了段jq后,报这个错,度娘未解,灵光一闪,找到原因,上代码: Html 结构: <a href="javascript:;" class="item-pic&qu ...
- Ext.encode 抛出异常“Uncaught RangeError: Maximum call stack size exceeded”
在用使用Ext.encode(ExtObject)过程中抛出了如下错误: Uncaught RangeError: Maximum call stack size exceeded 实际上,不能用 E ...
随机推荐
- 激光SLAM与视觉SLAM的特点
激光SLAM与视觉SLAM的特点 目前,SLAM技术被广泛运用于机器人.无人机.无人驾驶.AR.VR等领域,依靠传感器可实现机器的自主定位.建图.路径规划等功能.由于传感器不同,SLAM的实现方式也有 ...
- python+selenium基础篇,By定位元素
1.By定位和find_element_by_XXXXXX是一样的,如下图所示,定位元素的方法都是一样的 2.使用By定位代码如下所示 from selenium import webdriver f ...
- 在H5页面播放m3u8音频文件
需要使用hls插件 首先安装依赖npm install hls.js --save <audio ref="audio"></audio> import H ...
- 2020年11月CKA新题考试心得体会
1 什么是CKA CKA,即Certificated Kubernetes Administrator,CNCF官方提供的Kubernetes技能认证,含金量还是不错的.还有CKAD,相对简单一些,没 ...
- 一个例子让你秒懂 Qt Creator 编译原理
小北师兄作品 首发于微信公众号 小北师兄 微信 ID: ncuneupa 由于排版原因,文章可能读起来不太清晰,如果想看更好的排版,可以来我的公众号:小北师兄 大家好,我是你们的小北师兄,由于工作原因 ...
- 玩转STM32MP157- 使用 u8g2 驱动 OLED 12864(SSD1306)
环境 硬件环境:STM32MP157C-DK2 软件: MPU上使用ST官方提供的STM32MP15x OpenSTLinux Starter Package 编译系统:Ubuntu 1604 64b ...
- 温故知新,.Net Core遇见Postman(API Development),进阶分布式微服务高效调式
什么是Postman 环境变量(Environments) 全局协议 描述 变量 初始值 当前值 请求协议 request_protocol http http 授权信息 描述 变量 初始值 当前值 ...
- 八皇后O(1)算法题解
题目描述 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上.问共有多少种不同的方法,并且按字典序从小到大指出各种不同的放法. 题解 见证奇迹的时 ...
- web自动化页面元素不能键盘输入
一.背景 web自动化中存在一部分元素属性是readonly属性,导致我们在使用自动化代码的时候无法使用sendkeys()方法传入数据,以12306网站选择出发日期为例,见下图 二.json语句处理 ...
- 浅读tomcat架构设计之tomcat容器Container(3)
浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html 浅读tomcat架构设计之tom ...