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 ...
随机推荐
- Jittor 的Op, Var算子
Jittor 的Op, Var算子 要使用jittor训练模型,需要了解两个主要概念: Var:Jittor的基本数据类型 Operations:Jittor的算子与numpy类似 首先,开始使用Va ...
- MinkowskiEngine Miscellaneous Classes杂类
Miscellaneous Classes杂类 内核生成器 class MinkowskiEngine.KernelGenerator(kernel_size = -1,stride = 1,dila ...
- QT基本数据类型
因为Qt是一个C++框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数类型. QT基本数据类型定义在#inclu ...
- 【NX二次开发】Block UI 整数表
属性说明 常规 类型 描述 BlockID String 控件ID Enable Logical 是否可操作 Group Logical ...
- 【NX二次开发】根据根据坐标系、对象旋转视图旋转视图uc6434
uc6434 (); //旋转视图 参数1:如果输入""则旋转当前工作视图参数2:1.按照ABS旋转视图.2.按照WCS选择视图.3.按照参数3旋转视图.4.按照参数4旋转视图参数 ...
- 《Docker基础与实战,看这一篇就够了》
什么是Docker? Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术 ...
- 有效Ajax案例
<script>$(document).ready(function(){ $("input:submit").click(function(){ $.ajax({ t ...
- split截取字符串
一.根据单个分隔字符用split截取字符串:string st="GT123_1";split代码:string[] sArray=st.split("_"); ...
- 学习Qt Charts - Qt Charts的坐标轴
这次来学学Qt chart 的坐标轴 有这么一组数据: 这是深圳市2019年6月份的天气预报(来自中国天气网:深圳),里面有每天的最高温度,把这最高温度做成个数组,如下: int daily_temp ...
- Spring Cloud 整合 Feign 的原理
前言 在 上篇 介绍了 Feign 的核心实现原理,在文末也提到了会再介绍其和 Spring Cloud 的整合原理,Spring 具有很强的扩展性,会把一些常用的解决方案通过 starter 的方式 ...