算法题 最大频率栈

最大频率栈

问题描述

实现FreqStack类,模拟一个最大频率栈(频率栈)。

FreqStack有两个方法:

  • push(int val):将整数val推入栈中
  • pop()移除并返回栈中频率最高的元素
    • 如果有多个元素频率相同,返回最接近栈顶的元素

示例

FreqStackfreqStack=newFreqStack();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 的频率最高freqStack.pop();// 返回 7,5 和 7 频率相同(2),7 更接近栈顶freqStack.pop();// 返回 5freqStack.pop();// 返回 4

算法思路

多层栈 + 频率映射

  1. 核心数据结构

    • freq:哈希表,记录每个元素的当前频率
    • group:哈希表,group[f]存储所有频率为f的元素栈
    • maxFreq:记录当前最大频率
  2. push 操作

    • 更新元素频率:freq[val]++
    • 将元素推入对应频率的栈:group[freq[val]].push(val)
    • 更新最大频率:maxFreq = max(maxFreq, freq[val])
  3. pop 操作

    • group[maxFreq]弹出栈顶元素
    • 减少该元素的频率:freq[val]--
    • 如果group[maxFreq]为空,maxFreq--

代码实现

方法一:多层栈

importjava.util.*;classFreqStack{/** * 最大频率栈的实现 * * 核心数据结构: * - freq: 元素 -> 频率 * - group: 频率 -> 元素栈(存储该频率的所有元素) * - maxFreq: 当前最大频率 */privateMap<Integer,Integer>freq;// 元素频率映射privateMap<Integer,Deque<Integer>>group;// 频率分组栈privateintmaxFreq;// 当前最大频率publicFreqStack(){freq=newHashMap<>();group=newHashMap<>();maxFreq=0;}/** * 推入元素到频率栈 * * 时间复杂度: O(1) * * @param val 要推入的元素 */publicvoidpush(intval){// 更新元素频率intf=freq.getOrDefault(val,0)+1;freq.put(val,f);// 更新最大频率maxFreq=Math.max(maxFreq,f);// 将元素推入对应频率的栈group.computeIfAbsent(f,k->newArrayDeque<>()).push(val);}/** * 弹出频率最高且最接近栈顶的元素 * * 时间复杂度: O(1) * * @return 弹出的元素 */publicintpop(){// 从最大频率栈中弹出元素intval=group.get(maxFreq).pop();// 减少该元素的频率freq.put(val,freq.get(val)-1);// 如果当前最大频率的栈为空,减少最大频率if(group.get(maxFreq).isEmpty()){maxFreq--;}returnval;}}

算法分析

  • 时间复杂度:O(1)

    • 哈希表操作:O(1)
    • 栈操作:O(1)
    • 频率更新:O(1)
  • 空间复杂度:O(N)

    • N 是推入的元素总数
    • freq映射:O(不同元素数量)
    • group映射:O(N),因为每个推入的元素都在某个频率栈中
  • 正确性

    • 频率优先:总是从最大频率栈中弹出
    • 栈顶优先:同一频率的元素按推入顺序存储,后推入的在栈顶
    • 频率维护:pop 后正确更新元素频率和最大频率

算法过程

操作序列: push(5), push(7), push(5), push(7), push(4), push(5) 状态变化: push(5): - freq: {5:1} - group: {1: [5]} - maxFreq: 1 push(7): - freq: {5:1, 7:1} - group: {1: [7,5]} - maxFreq: 1 push(5): - freq: {5:2, 7:1} - group: {1: [7,5], 2: [5]} - maxFreq: 2 push(7): - freq: {5:2, 7:2} - group: {1: [7,5], 2: [7,5]} - maxFreq: 2 push(4): - freq: {5:2, 7:2, 4:1} - group: {1: [4,7,5], 2: [7,5]} - maxFreq: 2 push(5): - freq: {5:3, 7:2, 4:1} - group: {1: [4,7,5], 2: [7,5], 3: [5]} - maxFreq: 3 pop() → 5: - 从group[3]弹出5 - freq: {5:2, 7:2, 4:1} - group: {1: [4,7,5], 2: [7,5], 3: []} - maxFreq: 2 (因为group[3]为空) pop() → 7: - 从group[2]弹出7 - freq: {5:2, 7:1, 4:1} - group: {1: [4,7,5], 2: [5], 3: []} - maxFreq: 2 pop() → 5: - 从group[2]弹出5 - freq: {5:1, 7:1, 4:1} - group: {1: [4,7,5], 2: [], 3: []} - maxFreq: 1 (因为group[2]为空) pop() → 4: - 从group[1]弹出4 - freq: {5:1, 7:1, 4:0} - group: {1: [7,5], 2: [], 3: []} - maxFreq: 1

测试用例

importjava.util.*;publicclassTest{publicstaticvoidmain(String[]args){// 测试用例1:标准示例FreqStackfreqStack1=newFreqStack();freqStack1.push(5);freqStack1.push(7);freqStack1.push(5);freqStack1.push(7);freqStack1.push(4);freqStack1.push(5);System.out.println("Test 1:");System.out.println("pop1: "+freqStack1.pop());// 5System.out.println("pop2: "+freqStack1.pop());// 7System.out.println("pop3: "+freqStack1.pop());// 5System.out.println("pop4: "+freqStack1.pop());// 4// 测试用例2:单个元素FreqStackfreqStack2=newFreqStack();freqStack2.push(1);freqStack2.push(1);System.out.println("Test 2:");System.out.println("pop1: "+freqStack2.pop());// 1System.out.println("pop2: "+freqStack2.pop());// 1// 测试用例3:不同元素FreqStackfreqStack3=newFreqStack();freqStack3.push(1);freqStack3.push(2);freqStack3.push(3);System.out.println("Test 3:");System.out.println("pop1: "+freqStack3.pop());// 3System.out.println("pop2: "+freqStack3.pop());// 2System.out.println("pop3: "+freqStack3.pop());// 1// 测试用例4:复杂频率变化FreqStackfreqStack4=newFreqStack();freqStack4.push(1);freqStack4.push(2);freqStack4.push(1);freqStack4.push(3);freqStack4.push(2);freqStack4.push(1);System.out.println("Test 4:");System.out.println("pop1: "+freqStack4.pop());// 1 (freq=3)System.out.println("pop2: "+freqStack4.pop());// 2 (freq=2, more recent than 1)System.out.println("pop3: "+freqStack4.pop());// 1 (freq=2)System.out.println("pop4: "+freqStack4.pop());// 3 (freq=1)System.out.println("pop5: "+freqStack4.pop());// 2 (freq=1)System.out.println("pop6: "+freqStack4.pop());// 1 (freq=1)// 测试用例5:大量操作FreqStackfreqStack5=newFreqStack();for(inti=0;i<1000;i++){freqStack5.push(i%10);}// 测试用例6:边界值FreqStackfreqStack6=newFreqStack();freqStack6.push(Integer.MAX_VALUE);freqStack6.push(Integer.MIN_VALUE);freqStack6.push(Integer.MAX_VALUE);System.out.println("Test 6:");System.out.println("pop1: "+freqStack6.pop());// MAX_VALUESystem.out.println("pop2: "+freqStack6.pop());// MIN_VALUESystem.out.println("pop3: "+freqStack6.pop());// MAX_VALUE}}

关键点

  1. 数据结构

    • 使用DequeStack作为频率分组的容器
    • ArrayDequeStack更高效(避免同步开销)
  2. 频率维护

    • push 时增加频率并更新最大频率
    • pop 时减少频率并在必要时减少最大频率
  3. 栈顶优先

    • 同一频率的元素按推入顺序存储
    • 后推入的元素在栈顶,pop 时优先返回
  4. 空间效率

    • 每个推入的元素只存储一次
    • 频率映射只存储不同元素的频率

常见问题

  1. 为什么不用优先队列?
    • 优先队列无法高效处理频率动态变化的情况
    • 需要 O(log n) 时间更新优先级
    • 多层栈提供 O(1) 时间复杂度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1124738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问卷设计 “人工 VS AI” 终极 PK!虎贲等考 AI:30 分钟出专业量表,效率质感双碾压

做实证研究、写毕业论文时&#xff0c;问卷设计往往是 “耗时耗力却易翻车” 的关键环节 —— 人工设计要啃遍文献、精通量表逻辑、反复打磨题项&#xff0c;耗时数周仍可能因 “题项歧义”“逻辑断层”“信效度不达标” 导致数据作废&#xff1b;而普通 AI 工具生成的问卷又多…

港大突破:机器人实现稀疏记忆零样本视觉导航

这项由香港大学齐小娟教授团队与南方科技大学王忠锐教授联合开展的研究发表于2025年11月&#xff0c;论文编号为arXiv:2511.22609v1。研究团队包括王博、林杰宏、刘晨志、胡心婷、余艺霏、刘天嘉等多位研究者&#xff0c;他们共同提出了一种革命性的机器人视觉导航方法MG-Nav。…

家长管理数字化转型,2026教育管理新趋势

摘要Top Pick&#xff1a;爱查分 核心价值&#xff1a;从传统纸质管理到智能化家校互动&#xff0c;让每位家长参与孩子成长记录 关键亮点&#xff1a;专属隐私查询统一管理平台跨班级数据分析权限分级控制家校沟通桥梁 关键数据&#xff1a;减少89%家长纠纷提升34%教师工作满意…

【EI会议】第九届教育、网络与信息技术国际会议(ICENIT 2026)

为了探讨网络、信息技术在教育领域产生的影响&#xff0c;分享信息技术在教育领域应用的最佳实践经验和研究成果&#xff0c;推动相关领域的学术交流&#xff0c;第九届教育、网络与信息技术国际会议&#xff08;ICENIT 2026&#xff09;将于2026年7月24-26日在中国郑州召开。本…

算法题 单调数列

单调数列 问题描述 如果数组 nums 是单调递增或单调递减的&#xff0c;那么它是单调的。 如果对于所有 i < j&#xff0c;nums[i] < nums[j]&#xff0c;那么数组 nums 是单调递增的。 如果对于所有 i < j&#xff0c;nums[i] > nums[j]&#xff0c;那么数组 nums …

腾讯西雅图AI实验室突破:1%人工数据实现等效20倍数据训练

这项由腾讯西雅图AI实验室的余文豪博士领导的研究于2025年12月发表在arXiv预印本平台&#xff0c;论文编号为arXiv:2512.02472v1。研究团队还包括来自华盛顿大学圣路易斯分校的研究人员。这项研究在AI自我进化领域取得了重要突破&#xff0c;为人工智能的自主学习开辟了新的道路…

基于FPGA的DDS信号发生器:探索数字信号生成的奇妙之旅

基于FPGA的DDS信号发生器任意信号发生器&#xff0c;实物VerilogVHDL 本设计是在FPGA开发板上实现一个DDS信号发生器&#xff0c;输出波形有正弦波、方波、三角波和锯齿波等&#xff0c;输出波形频率范围0到20MHZ可调&#xff0c;波形最大幅度在0到5V之间可调&#xff0c;相位也…

Stable Diffusion 3.0:开启企业专属品牌视觉模型新时代

一、引言 在当今 AI 绘画领域,Stable Diffusion 3.0 凭借其强大的性能和广泛的应用,已然成为了众多开发者和企业关注的焦点。它基于先进的深度学习算法,能够根据用户输入的文本描述,生成高质量、多样化的图像,在艺术创作、设计、影视等诸多行业展现出巨大的价值。从艺术创…

AI搜索文献:高效精准的学术资源检索与获取新方法探讨

一、WisPaper&#xff1a;智能学术搜索激发科研灵感 科研创新的关键是了解前沿&#xff0c;找到突破口。但传统查文献方式往往效率低&#xff1a; Google Scholar 或 arXiv 搜索结果太多&#xff0c;难以筛选公众号推送滞后&#xff0c;容易错过最新研究文献阅读时间长&#…

中科院突破:虚拟仿真实现自动驾驶真车驾驶训练

这项由中国科学院自动化研究所的田浩晨领导的研究团队&#xff0c;联合香港大学和小米汽车等机构完成的研究发表于2025年11月的arXiv预印本平台&#xff0c;论文编号为arXiv:2511.23369v1。对这项突破性研究感兴趣的读者可以通过该编号查询完整论文内容。 想象这样一个场景&…

中科大团队突破性解决视觉语言动作模型的视野局限

这项由中国人民大学、北京大学、香港中文大学联合开展的研究发表于2024年11月&#xff0c;论文编号为arXiv:2511.19433v1。研究团队由董靖、王钢、刘佳琪、唐维亮、孙泽龙、姚云超、魏振宇、刘云辉、陆志武、丁明宇等学者组成&#xff0c;他们首次系统性地解决了视觉语言动作模…

【Java毕设源码分享】基于springboot+vue的产品订单管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

基于springboot框架的服装商城销售系统_0895i6w5

目录 系统概述技术架构核心功能扩展性与安全 开发技术 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述…

知识管理工具又添新锐,notion vs sward一文对比解析

Notion是一款很有影响力的全功能协作工具&#xff0c;以简洁易用著称&#xff0c;而 sward 作为一款新兴的开源知识管理工具&#xff0c;也凭借其轻量、支持一键安装、界面简洁易用等特点吸引了众多关注。那么&#xff0c;在实际工作场景中&#xff0c;哪一款工具更符合团队需求…

项目管理工具又添新锐,MantisBT vs Kanass一文对比解析

MantisBT是一款偏缺陷管理的项目工具&#xff0c;kanass是一款国产开源且免费的项目管理工具&#xff0c;包含项目、项目集、产品、工时、计划等功能模块。本文将从功能、用户体验、集成能力等方面对比二者&#xff0c;助力团队选择合适的工具。1、安装部署对比项MantisBTkanas…

全栈式智慧园区管理系统:技术架构、场景落地与效能革新

当传统园区还困于 “人工巡检效率低、设备故障响应慢、空间资源调度乱” 的痛点时&#xff0c;以物联网、数字孪生、边缘计算为核心的智慧园区管理系统&#xff0c;正成为城市产业载体升级的核心引擎。YUNMELL 云迈科技推出的全栈式智慧园区管理系统&#xff0c;通过 “项目空间…

Linux的PS1 配置示例

这个 PS1 配置包含多个部分&#xff0c;让我详细分解&#xff1a;整体结构分析\[\e]0;\u\h: \w\a\]${debian_chroot:($debian_chroot)}\[\033[01;32m\]\u\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$1. 第一部分&#xff1a;终端标题设置\[\e]0;\u\h: \w\a\]\[\e]0; 开始设…

导师严选9个AI论文软件,专科生搞定毕业论文+格式规范!

导师严选9个AI论文软件&#xff0c;专科生搞定毕业论文格式规范&#xff01; AI 工具如何成为专科生毕业论文的得力助手 随着人工智能技术的不断发展&#xff0c;AI 工具在学术写作中的应用越来越广泛。对于专科生来说&#xff0c;撰写一篇符合格式规范、内容严谨的毕业论文是一…

springboot+vue+Mysql的学生信息管理系统设计_xu1v7aa3

目录系统架构设计功能模块划分数据库设计技术实现细节系统特色与优化开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式…

知识管理工具又添新锐,语雀 vs sward一文对比解析

语雀是一款页面简洁且易用的知识管理工具&#xff0c;而 Sward 作为一款新兴的开源知识管理工具&#xff0c;也凭借其轻量、支持一键安装、界面简洁易用等特点吸引了众多关注。本文将从功能特性、操作体验等多个维度进行逐一对比&#xff0c;以期为团队在工具选型时提供参考依据…