题目链接: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的更多相关文章

  1. [LeetCode] 895. Maximum Frequency Stack 最大频率栈

    Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...

  2. 【LeetCode】895. Maximum Frequency Stack 解题报告(Python)

    [LeetCode]895. Maximum Frequency Stack 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxueming ...

  3. LeetCode - Maximum Frequency Stack

    Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...

  4. [Swift]LeetCode895. 最大频率栈 | Maximum Frequency Stack

    Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...

  5. 最大频率栈 Maximum Frequency Stack

    2018-10-06 22:01:11 问题描述: 问题求解: 为每个频率创建一个栈即可. class FreqStack { Map<Integer, Integer> map; Lis ...

  6. Maximum Frequency Stack

    Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...

  7. Uncaught RangeError: Maximum call stack size exceeded 调试日记

    异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 开发道路上不是解决问题最重要,而是解决问题的过程,这个过程我们称之为~~~调试 记 ...

  8. Uncaught RangeError: Maximum call stack size exceeded 超出最大调用值(个人解释)

    写了段jq后,报这个错,度娘未解,灵光一闪,找到原因,上代码: Html 结构: <a href="javascript:;" class="item-pic&qu ...

  9. Ext.encode 抛出异常“Uncaught RangeError: Maximum call stack size exceeded”

    在用使用Ext.encode(ExtObject)过程中抛出了如下错误: Uncaught RangeError: Maximum call stack size exceeded 实际上,不能用 E ...

随机推荐

  1. 牛客网sql实战参考答案(mysql版):1-15

    1.查找最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天(sqlite里面的注释为--,mysql为comment) CREATE TABLE `employees ...

  2. 聊一聊.NET Core结合Nacos实现配置加解密

    背景 当我们把应用的配置都放到配置中心后,很多人会想到这样一个问题,配置里面有敏感的信息要怎么处理呢? 信息既然敏感的话,那么加个密就好了嘛,相信大部分人的第一感觉都是这个,确实这个是最简单也是最合适 ...

  3. 性能工具之Jmeter小白入门系列之一

    一.简单了解 Apache JMeter The Apache JMeter application is open source software, a 100% pure Java applica ...

  4. 『无为则无心』Python基础 — 5、Python开发工具的安装与使用

    目录 1.Pycharm下载 2.Pycharm安装 3.PyCharm界面介绍 4.基本使用 (1)新建Python项目 (2)编写Python代码 (3)执行代码查看结果 (4)设置PyCharm ...

  5. Jenkins 进阶篇 - 节点配置

    当我们使用 Jenkins 构建的项目达到一定规模后,一个 Jenkins 服务可能承受不了负载,会导致很多的构建任务堆积,严重的话还会拖垮这台服务器,导致上面的服务无法使用.例如我们公司目前在 Je ...

  6. Vue(4)Vue指令的学习1

    前言 Vue官网一共有提供了14个指令,分别如下 v-text v-html v-show v-if ☆☆☆ v-else ☆☆☆ v-else-if ☆☆☆ v-for ☆☆☆ v-on ☆☆☆ v ...

  7. 关于Mysql事务,你必须知道的几个知识点!

    Transaction事务 上期我们讲到了jpa的常用操作,查询.更新.删除等,但是如果在操作数据库事务时发生异常,数据会回滚吗?下面我们来看个例子 UserController新增如下代码: @Ge ...

  8. .NET Core/.NET5/.NET6 开源项目汇总10:实用工具

    系列目录     [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...

  9. Linux中系统时间同步ntpdate简介

    Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用ntpdate进行时间同步.所 ...

  10. 第15章: Prometheus监控Kubernetes资源与应用

    Prometheus监控Kubernetes资源与应用 目录 1 监控方案 2 2 监控指标 4 3 实现思路 4 4 在K8S中部署Prometheus 4 5 在K8S中部署Grafana与可视化 ...