文章目录
- 1. 题目
- 2. 解题
1. 题目
实现 FreqStack,模拟类似栈的数据结构的操作的一个类。
FreqStack 有两个函数:
- push(int x),将整数 x 推入栈中。
- pop(),它移除并返回栈中出现最频繁的元素。
如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。
示例:
输入:
["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)查找
class FreqStack {unordered_map<int,int> freq;//num,frequnordered_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
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!