【哈希表】LeetCode 895. 最大频率栈
题目链接
思路
很容易想到使用 map:valToFreq
来记录每个值出现的频率,这是没问题的,但关键是如何通过频率寻找到应该返回的数。
这时候我想到再加一个 map:freqToVal
来记录每个频率中出现的数字,为了符合题目返回最接近栈顶的元素的要求,freqToVal
的键值对类型选择 <Integer, Deque<Integer>>
,这样如果两个元素是同频率的,就会返回最接近栈顶的元素。
代码
class FreqStack {
// 当前 FreqStack 中的最大频率值
int maxFreq;
// 记录 FreqStack 中每个元素出现的频率
TreeMap<Integer, Integer> valToFreq;
// 记录每个频率对应的元素值
TreeMap<Integer, Deque<Integer>> freqToVal;
public FreqStack() {
this.maxFreq = 0;
this.valToFreq = new TreeMap<>();
this.freqToVal = new TreeMap<>();
}
public void push(int val) {
valToFreq.put(val, valToFreq.getOrDefault(val, 0) + 1);
int freq = valToFreq.get(val);
maxFreq = Math.max(maxFreq, freq);
// 第一次出现这个频率
if(!freqToVal.containsKey(freq)){
freqToVal.put(freq, new ArrayDeque<>());
}
freqToVal.get(freq).push(val);
}
public int pop() {
Deque<Integer> stack = freqToVal.get(maxFreq);
int result = stack.pop();
valToFreq.put(result, valToFreq.getOrDefault(result, 0) - 1);
// 如果当前频率没有元素了,就需要更新最大频率
while(
maxFreq > 0 &&
(
!freqToVal.containsKey(maxFreq) ||
freqToVal.getOrDefault(maxFreq, new ArrayDeque<>()).isEmpty()
)
){
maxFreq--;
}
return result;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」