【leetcode】895最大频率栈
leetcode的895最大频率栈题解,题目来自快手面经:https://www.nowcoder.com/discuss/493925109460135936
题目
设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。
实现 FreqStack 类:
- FreqStack() 构造一个空的堆栈。
- void push(int val) 将一个整数 val 压入栈顶。
- int pop() 删除并返回堆栈中出现频率最高的元素。
如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。
1 | 示例 1: |
提示:
0 <= val <= 109
;- push 和 pop 的操作数不大于
2 * 104
。 - 输入保证在调用 pop 之前堆栈中至少有一个元素。
思路
看到hard直接害怕,题解一看发现好像没有那么难……就是让我自己想恐怕是想不出来的。
用哈希表加栈就能解决这个问题,另外还需一个int变量维护当前最高频率是多少。
- 一个哈希表用于元素和频率的计数
- 一个哈希表用于频率和对应的栈
当插入元素的时候
- 元素出现频率加一
- 在对应频率的栈中插入元素(并不需要在之前的栈中删除元素)
- 更新当前最高频率
当弹出元素的时候
- 从最高频率的栈中弹出一个元素
- 该元素出现频率减一
- 如果最高频率的栈为空,则最高频率减一(因为每次都是以1的间隔增加的,所以减一的栈里面肯定会有元素)
这样就能很巧妙的实现题目需要的栈。
- 哈希表中频率从低到高能理解为是一层栈,因为后入的频率高的数在栈顶;
- 相同频率中又是一层栈;
即可以体现每一个数字的频率,又能保证栈的先入先出的特性!
代码
思路并不难,代码实现也很简单
1 | class FreqStack { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 慕雪的寒舍!
评论