Problem

实现 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]。

Solution

这道题目我使用了两个哈希表:

Freq用来统计数字出现的次数: integer->unsigned

FreqStack用来统计出现次数所对应的栈:unsigned->stack<int>

主要的解法是为每次出现第几次的元素建一个栈,比如

1,3,4,5,1,1,

那么1,3,4,5就会在FreqStack[1]上因为他们的出现次数为1

而第二次出现的1就会压入FreqStack[2],第三次出现的1会出现在FreqStack[3],以此类推。

Freq哈希表的辅助下,判断出现次数会相当容易。AC代码如下

class FreqStack {
public:
void push(int x) {
Freq[x]++;
maxfreq = max(Freq[x], maxfreq);
FreqStack[Freq[x]].push(x);
} int pop() {
int x = FreqStack[maxfreq].top();
FreqStack[maxfreq].pop();
if(FreqStack[Freq[x]].empty())
maxfreq--;
Freq[x]--;
return x;
} private:
unordered_map<int, unsigned> Freq;
unordered_map<unsigned, stack<int>> FreqStack;
unsigned maxfreq = 0;
};

最新文章

  1. 使用jq插入节点
  2. EasyUI 开发笔记(一)
  3. flex中文说明手册
  4. 《UNIX网络编程》之多客户连接服务端,可重用套接字对
  5. Example_07_05录音提示open failed: EACCES (Permission denied)
  6. ubuntu安装greenplum依赖包
  7. Winform使用的一些常识
  8. MongoDB增 删 改 查
  9. 前端之旅HTML与CSS篇之a便签中放入其他块元素会撑大高度的原因
  10. c语言最大公约数及最小公倍数的详解
  11. java异常——五个关键字(try、catch、finally、throw、throws)
  12. django migrate报错(提前删除表等)
  13. Golang Kernel For Jupyter-NoteBook
  14. linux 启动 Oracle 实例
  15. capjoint一些生成文件的解释
  16. FAX modem和传真协议简介
  17. PT100高精度测温电路 AD623+REF3030(转)
  18. UI5-文档-4.30-Debugging Tools
  19. Git操作(基础篇)
  20. go 学习 ---数据类型

热门文章

  1. Vmware Workstation - linux系统下 VmTools 安装
  2. Scrum冲刺阶段6
  3. sjms-2 创建型模式
  4. java策略设计模式
  5. CentOS 7 rabbitmq 安装
  6. 关于Asp.net事件,如何在触发子控件的事件时,同步触发父页面的事件
  7. Note | Git
  8. Astrology PHP 框架
  9. python for data analysis 2nd 读书笔记(一)
  10. window下载android 最新源码