友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
|
|
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

公众号的微信号是: jikerizhi。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
895. 最大频率栈
设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。
实现 FreqStack 类:
-
FreqStack()构造一个空的堆栈。 -
void push(int val)将一个整数val压入栈顶。 -
int pop()删除并返回堆栈中出现频率最高的元素。-
如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。
-
示例 1:
输入: ["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] 解释: FreqStack = new FreqStack(); freqStack.push (5);//堆栈为 [5] freqStack.push (7);//堆栈是 [5,7] freqStack.push (5);//堆栈是 [5,7,5] freqStack.push (7);//堆栈是 [5,7,5,7] freqStack.push (4);//堆栈是 [5,7,5,7,4] freqStack.push (5);//堆栈是 [5,7,5,7,4,5] freqStack.pop ();//返回 5 ,因为 5 出现频率最高。堆栈变成 [5,7,5,7,4]。 freqStack.pop ();//返回 7 ,因为 5 和 7 出现频率最高,但7最接近顶部。堆栈变成 [5,7,5,4]。 freqStack.pop ();//返回 5 ,因为 5 出现频率最高。堆栈变成 [5,7,4]。 freqStack.pop ();//返回 4 ,因为 4, 5 和 7 出现频率最高,但 4 是最接近顶部的。堆栈变成 [5,7]。
提示:
-
0 <= val <= 109 -
push和pop的操作数不大于2 * 104。 -
输入保证在调用
pop之前堆栈中至少有一个元素。
思路分析
只想到使用哈希记录出现次数,没想到可以根据出现次数去建立多个栈。
-
一刷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2026-09-02 22:28:10
*/
class FreqStack {
private List<Deque<Integer>> stacks;
private Map<Integer, Integer> cnt;
public FreqStack() {
stacks = new ArrayList<>();
cnt = new HashMap<>();
}
public void push(int val) {
int c = cnt.getOrDefault(val, 0);
if (c == stacks.size()) {
stacks.add(new ArrayDeque<>());
}
stacks.get(c).push(val);
cnt.put(val, c + 1);
}
public int pop() {
int top = stacks.size() - 1;
Integer var = stacks.get(top).pop();
if (stacks.get(top).isEmpty()) {
stacks.remove(top);
}
cnt.merge(var, -1, Integer::sum);
return var;
}
}

