前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 895. 最大频率栈(哈希+按频数存储)

LeetCode 895. 最大频率栈(哈希+按频数存储)

作者头像
Michael阿明
发布2021-02-19 09:46:53
4700
发布2021-02-19 09:46:53
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

实现 FreqStack,模拟类似栈的数据结构的操作的一个类。

FreqStack 有两个函数:

  • push(int x),将整数 x 推入栈中。
  • pop(),它移除并返回栈中出现最频繁的元素。 如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。
代码语言:javascript
复制
示例:
输入:
["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]
解释:
执行六次 .push 操作后,栈自底向上为 [5,7,5,7,4,5]。然后:

pop() -> 返回 5,因为 5 是出现频率最高的。
栈变成 [5,7,5,7,4]。

pop() -> 返回 7,因为 5 和 7 都是频率最高的,但 7 最接近栈顶。
栈变成 [5,7,5,4]。

pop() -> 返回 5 。
栈变成 [5,7,4]。

pop() -> 返回 4 。
栈变成 [5,7]。
 
提示:
对 FreqStack.push(int x) 的调用中 0 <= x <= 10^9。
如果栈的元素数目为零,则保证不会调用  FreqStack.pop()。
单个测试样例中,对 FreqStack.push 的总调用次数不会超过 10000。
单个测试样例中,对 FreqStack.pop 的总调用次数不会超过 10000。
所有测试样例中,对 FreqStack.push 和 FreqStack.pop 的
				总调用次数不会超过 150000。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-frequency-stack 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 哈希表1记录每个数的频数
  • 哈希表2记录频数下,对应有哪些元素,value为栈,保证出栈时是靠近栈顶的
  • 记录最大频数,实现O(1)查找
代码语言:javascript
复制
class FreqStack {
	unordered_map<int,int> freq;//num,freq
	unordered_map<int, stack<int>> stk;//freq,栈,一个数有这个频数时,存入
	int maxfreq = 0;//最大频数
	int x;
public:
    FreqStack() {

    }
    
    void push(int x) {
    	freq[x]++;
    	maxfreq = max(maxfreq, freq[x]);
    	stk[freq[x]].push(x);
    }
    
    int pop() {
    	x = stk[maxfreq].top();
        freq[x]--;
    	stk[maxfreq].pop();
    	if(stk[maxfreq].empty())
    		maxfreq--;
    	return x;
    }
};

420 ms 77.8 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档