当前位置: 首页 > news >正文

最大频率栈

在这里插入图片描述

代码逻辑

这道题的关键在于:如何同时维护频率信息和时间顺序?

我们可以把栈想象成一个"蛋糕",按频率分层:

  • 第 1 层:存放所有出现过 1 次的元素
  • 第 2 层:存放所有出现过 2 次的元素
  • 第 3 层:存放所有出现过 3 次的元素

每当一个元素被 push 进来,它的频率加 1然后它会被添加到对应频率的那一层。

每当执行 pop 操作,从最高层(最大频率层)取出最后一个元素,如果该层变空,层数减 1。

1.数据结构设计
class FreqStack {// 当前最大频率private int topTimes;// 分层存储:频率 -> 该频率下的元素列表private HashMap<Integer, ArrayList<Integer>> cntValues= new HashMap<>();// 元素计数:元素值 -> 出现次数private HashMap<Integer, Integer> valueTimes== new HashMap<>();
}
2.push 操作
public void push(int val) {// 更新该元素的频率valueTimes.put(val, valueTimes.getOrDefault(val, 0) + 1);int curTopTimes = valueTimes.get(val);// 将元素添加到对应频率层if (!cntValues.containsKey(curTopTimes)) {cntValues.put(curTopTimes, new ArrayList<>());}ArrayList<Integer> curTimeValues = cntValues.get(curTopTimes);curTimeValues.add(val);// 更新最大频率topTimes = Math.max(topTimes, curTopTimes);
}
3.pop 操作
public int pop() {// 从最高层取出最后一个元素ArrayList<Integer> topTimeValues = cntValues.get(topTimes);int ans = topTimeValues.remove(topTimeValues.size() - 1);// 如果该层变空,删除该层并降低最高频率if (topTimeValues.size() == 0) {cntValues.remove(topTimes--);}// 更新元素的频率计数int times = valueTimes.get(ans);if (times == 1) {valueTimes.remove(ans);} else {valueTimes.put(ans, times - 1);}return ans;
}

完整代码

class FreqStack{// 当前最大频率private int topTimes;// 分层存储:频率 -> 该频率下的元素列表private HashMap<Integer, ArrayList<Integer>> cntValues= new HashMap<>();// 元素计数:元素值 -> 出现次数private HashMap<Integer, Integer> valueTimes= new HashMap<>();public void push(int val) {// 更新该元素的频率valueTimes.put(val, valueTimes.getOrDefault(val, 0) + 1);int curTopTimes = valueTimes.get(val);// 将元素添加到对应频率层if (!cntValues.containsKey(curTopTimes)) {cntValues.put(curTopTimes, new ArrayList<>());}ArrayList<Integer> curTimeValues = cntValues.get(curTopTimes);curTimeValues.add(val);// 更新最大频率topTimes = Math.max(topTimes, curTopTimes);}public int pop() {// 从最高层取出最后一个元素ArrayList<Integer> topTimeValues = cntValues.get(topTimes);int ans = topTimeValues.remove(topTimeValues.size() - 1);// 如果该层变空,删除该层并降低最高频率if (topTimeValues.size() == 0) {cntValues.remove(topTimes--);}// 更新元素的频率计数int times = valueTimes.get(ans);if (times == 1) {valueTimes.remove(ans);} else {valueTimes.put(ans, times - 1);}return ans;}}

关注我,带你深度剖析更多经典算法题! 🚀

http://www.dtcms.com/a/529649.html

相关文章:

  • 辽宁双高建设专题网站怎么看一个网站有没有做百度推广
  • Dify异步接口调用优化实践:解决长时任务处理与网络超时问题
  • wordpress小图标网站百度快速排名 搜
  • 还在“手动开关图层”?Photoshop“图层复合”的UI多状态批量导出工作流
  • [人工智能-大模型-73]:模型层技术 - 模型训练六大步:②数据选择:基本功能与对应的基本组成函数
  • 河北黄骅市简介seo优化常识
  • 南京百度网站制作app备案查询平台官网
  • go-ethereum core之statedb
  • [人工智能-大模型-76]:模型层技术 - 模型训练六大步:⑤反向传播,计算迭代梯度,找出偏差的原因 - 基本功能与对应的基本组成函数
  • 代码随想录Day58|拓扑排序精讲、dijkstra(朴素版)精讲
  • 基于多焦点高斯邻域注意力机制与大规模基准的视频人群定位
  • 乐清网站制作公司招聘郫县建设局网站
  • 第二次作业-第二章的时间服务
  • 广州网站制作开发公司哪家好游戏开发物语下载
  • 电机试验平台的基本组成
  • 简单风景网站模版旅游网站如何做推广
  • 天津市城市建设学校官方网站教用vs2013做网站的书
  • 最好的域名注册网站jexus wordpress
  • Dataflare:一款简单易用的数据库管理工具
  • When NOMA Meets AIGC: Enhanced WirelessFederated Learning
  • 能源网站建设wordpress开头空两格
  • 网站建设不一定当地最新黑帽seo培训
  • 【ShardingSphere5】实战教程(快速入门掌握核心)
  • 网站上线后做什么ssh做网站步骤
  • 多线程之阻塞队列
  • NOR Flash,25Q系列,25Q80,25Q16,25Q32,对标普冉,兆易,恒硕,华邦等,低功耗SPI NOR,闪存芯片
  • WordPress怎么建小站单页营销网站
  • 笔记【字符串及相关操作】
  • 网站建设 探索扬州建网站
  • 合肥网站制作建设中企动力公司是国企吗