【算法题】堆

堆(优先队列)是一种基于完全二叉树的动态数据结构,核心特性是快速获取最值(大根堆获取最大值,小根堆获取最小值),插入和删除操作的时间复杂度均为O(log⁡n)O(\log n)O(logn)。它广泛应用于“动态维护最值”“Top-K 问题”“中位数维护”等场景,是处理动态数据的高效工具。本文通过4道经典题目,拆解堆在不同场景下的解题思路与代码实现。

一、最后一块石头的重量

题目描述:
有一堆石头,每回合选两块最重的石头粉碎:若重量相等则完全粉碎,否则剩下重量为两者差值的石头。返回最后剩下的石头重量(无剩余则返回0)。

示例

  • 输入:stones = [2,7,4,1,8,1],输出:1(粉碎过程:8-7=14-2=22-1=11-1=0→剩1)

解题思路:
用大根堆维护石头重量,每次取最大的两块处理:

  1. 将所有石头重量入大根堆。
  2. 当堆中元素数>1时,取出最大的两块aba ≥ b):
    • a > b,将a - b入堆;
    • a == b,直接丢弃两块。
  3. 最终堆中若有元素则返回堆顶,否则返回0。

完整代码:

classSolution{public:intlastStoneWeight(vector<int>&stones){priority_queue<int>heap;// 大根堆(默认)for(autox:stones)heap.push(x);while(heap.size()>1){inta=heap.top();heap.pop();intb=heap.top();heap.pop();if(a>b)heap.push(a-b);}returnheap.size()?heap.top():0;}};

复杂度分析:

  • 时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)n为石头数量,每次入堆/出堆操作时间为O(log⁡n)O(\log n)O(logn),最多执行nnn次。
  • 空间复杂度:O(n)O(n)O(n),堆存储所有石头重量。

二、数据流中的第K大元素

题目描述:
设计一个类,动态维护数据流中的第K大元素(排序后的第K大,非第K个不同元素)。实现KthLargest类,包含初始化和添加元素后返回第K大的方法。

示例

  • 初始化:k=3, nums=[4,5,8,2],添加3→返回4,添加5→返回5,添加10→返回5。

解题思路:
用小根堆维护“前K大的元素”,堆顶即为第K大元素:

  1. 初始化时,将所有元素入堆,若堆大小超过K则弹出堆顶(保留前K大的元素)。
  2. 添加元素时,将新元素入堆,若堆大小超过K则弹出堆顶,堆顶即为当前第K大元素。

完整代码:

classKthLargest{int_k;priority_queue<int,vector<int>,greater<int>>heap;// 小根堆public:KthLargest(intk,vector<int>&nums){_k=k;for(auto&x:nums){heap.push(x);if(heap.size()>_k)heap.pop();}}intadd(intval){heap.push(val);if(heap.size()>_k)heap.pop();returnheap.top();}};

复杂度分析:

  • 初始化时间:O(nlog⁡K)O(n\log K)O(nlogK)n为初始元素数,每个元素入堆/出堆时间为O(log⁡K)O(\log K)O(logK)
  • 添加元素时间:O(log⁡K)O(\log K)O(logK),每次入堆/出堆时间为O(log⁡K)O(\log K)O(logK)
  • 空间复杂度:O(K)O(K)O(K),堆最多存储K个元素。

三、前K个高频单词

题目描述:
给定单词列表words和整数k,返回前K个出现次数最多的单词(频率相同按字典序升序排列)。

示例

  • 输入:words = ["i","love","leetcode","i","love","coding"], k=2,输出:["i","love"](频率均为2,字典序i < love

解题思路:
哈希表统计频率 + 小根堆维护前K个高频单词:

  1. 用哈希表统计每个单词的出现频率。
  2. 定义小根堆的比较规则:
    • 频率不同时,频率小的优先出堆;
    • 频率相同时,字典序大的优先出堆(保证堆顶是“频率最小/字典序最大”的候选,弹出后保留前K个)。
  3. 遍历哈希表,将“单词-频率”入堆,若堆大小超过K则弹出堆顶。
  4. 逆序收集堆中元素(因小根堆弹出的是较小的元素,需反转得到从大到小的顺序)。

完整代码:

classSolution{typedefpair<string,int>PSI;structcmp{booloperator()(constPSI a,constPSI b){if(a.second==b.second)returna.first<b.first;// 频率相同,字典序大的优先出堆elsereturna.second>b.second;// 频率小的优先出堆}};public:vector<string>topKFrequent(vector<string>&words,intk){unordered_map<string,int>hash;for(auto&x:words)hash[x]++;priority_queue<PSI,vector<PSI>,cmp>heap;for(auto&psi:hash){heap.push(psi);if(heap.size()>k)heap.pop();}vector<string>ret(k);for(inti=heap.size()-1;i>=0;i--){ret[i]=heap.top().first;heap.pop();}returnret;}};

复杂度分析:

  • 时间复杂度:O(mlog⁡k)O(m\log k)O(mlogk)m为不同单词的数量,每个单词入堆/出堆时间为O(log⁡k)O(\log k)O(logk)
  • 空间复杂度:O(m+k)O(m + k)O(m+k),哈希表存储所有单词频率,堆存储K个单词。

四、数据流的中位数

题目描述:
设计一个类,动态维护数据流的中位数(奇数个元素取中间值,偶数个取中间两个的平均值)。实现MedianFinder类,包含添加元素和获取中位数的方法。

示例

  • 添加1→添加2→中位数1.5→添加3→中位数2.0

解题思路:
用两个堆维护数据流的左右两部分:

  1. 大根堆left:存储左半部分元素(≤中位数),堆顶为左半部分最大值;
  2. 小根堆right:存储右半部分元素(≥中位数),堆顶为右半部分最小值;
  3. 保持平衡规则:
    • 总元素数为偶数时,left.size() == right.size()
    • 总元素数为奇数时,left.size() = right.size() + 1(中位数为left.top());
  4. 添加元素时,根据元素与堆顶的大小关系选择入堆,并调整堆的大小以保持平衡。

完整代码:

classMedianFinder{priority_queue<int>left;// 大根堆(左半部分)priority_queue<int,vector<int>,greater<int>>right;// 小根堆(右半部分)public:MedianFinder(){}voidaddNum(intnum){if(left.size()==right.size()){if(left.empty()||num<left.top()){left.push(num);}else{right.push(num);left.push(right.top());right.pop();}}else{if(num<left.top()){left.push(num);right.push(left.top());left.pop();}else{right.push(num);}}}doublefindMedian(){if(left.size()==right.size())return(left.top()+right.top())/2.0;elsereturnleft.top();}};

复杂度分析:

  • 添加元素时间:O(log⁡n)O(\log n)O(logn),每次入堆/出堆时间为O(log⁡n)O(\log n)O(logn)
  • 获取中位数时间:O(1)O(1)O(1),直接取堆顶计算。
  • 空间复杂度:O(n)O(n)O(n),两个堆存储所有元素。

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

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

相关文章

PasteEx:一款.NET开源的Windows快捷粘贴神器

前言PasteEx是一款.NET开源的用于增强 Windows 粘贴功能的小工具&#xff0c;它解决了将剪贴板内容保存为文件的繁琐步骤。无需打开记事本等应用&#xff0c;它可直接将文字、图片等内容粘贴到桌面上&#xff0c;极大提升了效率。功能特点自定义文本扩展规则&#xff1a;用户可…

2026年膏滋贴牌/拿货/定制/实力厂家推荐:湖北李时珍大健康源头工厂 - 品牌推荐官

在健康消费升级的浪潮下,膏滋类产品凭借其天然、便捷的特性,成为大健康市场的热门品类。据行业数据显示,2025年国内膏滋市场规模已突破120亿元,年复合增长率达18%,其中定制化、品牌化需求占比超65%。面对这一趋势…

《云计算到底是什么?IaaS/PaaS/SaaS 怎么分?一篇读懂不踩坑》

一、云计算&#xff1a;不止是技术&#xff0c;更是 IT 消费模式的革命 提到云计算&#xff0c;很多人会联想到 “把数据存到云上”&#xff0c;但这只是冰山一角。云计算的本质&#xff0c;是新技术与 IT 业务模式的双重创新—— 它通过技术将 IT 资源池化、服务化&#xff0…

C/C++访问MySQL数据库

C/C访问MySQL数据库 VS2019配置 第一步&#xff1a;打开mysql的安装目录&#xff0c;默认安装目录如下&#xff1a;C:\Program Files\MySQL\MySQL Server 8.0&#xff0c;确认 lib 目录和include 目录是否存在。 第二步&#xff1a;打开VS2019&#xff0c;新建一个空工程,控制台…

打工人学生党必看!Trilium Notes + cpolar,知识管理不被地点绑死

Trilium Notes 是一款主打结构化知识管理的开源笔记软件&#xff0c;支持树状层级组织笔记&#xff0c;可编辑富文本、Markdown、LaTeX 公式、Mermaid 流程图等内容&#xff0c;还具备全文检索、笔记加密、版本控制等功能&#xff0c;能适配不同人群的笔记整理需求&#xff0c;…

精选 4 款基于 C# 开源、实用的工具类库,开发效率提升利器!

前言 在我们日常工作开发中工具类库是软件开发中不可或缺的一部分&#xff0c;它们通过提供通用功能、实现代码复用、封装复杂逻辑、提升代码质量与可维护性&#xff0c;帮助开发者更高效、更稳定地构建软件应用程序。 今天大姚给大家分享 4 款基于 C# 开源、免费、实用的工具…

强烈安利专科生必看!10个AI论文网站深度测评

强烈安利专科生必看&#xff01;10个AI论文网站深度测评 2026年专科生必备的AI论文工具测评 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的AI论文网站&#xff0c;如何选择真正适合自己需求的…

实测!旧手机秒变 Web 服务器,KSWEB+cpolar 摆脱局域网束缚

KSWEB 是一款专为安卓设备设计的 Web 服务器软件&#xff0c;它内置了 PHP、MySQL、Apache 等核心组件&#xff0c;无需繁琐的环境配置&#xff0c;就能让安卓手机变身 Web 服务器&#xff0c;支持部署 Typecho 这类轻量级博客系统&#xff0c;还附带 phpAdmin 工具方便管理数据…

2026年浊度仪优质厂家推荐排名,选择不用愁! - 工业品牌热点

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为工业自动化领域企业选型浊度仪提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:杭州联测自动化技术有限公司 推荐指数:★★★★★ | 口碑…

GESP认证C++编程真题解析 | P11960 [GESP202503 五级] 平均分配

​欢迎大家订阅我的专栏&#xff1a;算法题解&#xff1a;C与Python实现&#xff01; 本专栏旨在帮助大家从基础到进阶 &#xff0c;逐步提升编程能力&#xff0c;助力信息学竞赛备战&#xff01; 专栏特色 1.经典算法练习&#xff1a;根据信息学竞赛大纲&#xff0c;精心挑选…

GESP认证C++编程真题解析 | P11961 [GESP202503 五级] 原根判断

​欢迎大家订阅我的专栏&#xff1a;算法题解&#xff1a;C与Python实现&#xff01; 本专栏旨在帮助大家从基础到进阶 &#xff0c;逐步提升编程能力&#xff0c;助力信息学竞赛备战&#xff01; 专栏特色 1.经典算法练习&#xff1a;根据信息学竞赛大纲&#xff0c;精心挑选…

springboot医疗器械预定小程序设计开发实现

开发背景医疗器械预定小程序基于SpringBoot的开发需求主要源于医疗行业数字化转型的迫切性。传统医疗器械采购流程存在效率低、信息不透明、管理困难等问题&#xff0c;而移动互联网技术的普及为优化这一流程提供了技术基础。行业痛点&#xff1a;医疗机构常面临器械库存不清、…

ssm自习室预约小程序的设计与实现

背景分析近年来&#xff0c;高校及公共学习场所的自习资源紧张问题日益突出&#xff0c;学生面临“占座难”“管理混乱”等痛点。传统人工登记方式效率低下&#xff0c;纸质签到易丢失数据&#xff0c;难以满足高峰时段的预约需求。数字化管理成为提升资源利用率的必然趋势。社…

上海装修设计选哪家?2026年优质公司精选,法式大平层设计/软装设计/奶油风房屋装修,上海装修设计团队推荐榜 - 品牌推荐师

随着上海城市化进程加速与居住品质升级,装修设计行业迎来结构性变革。消费者对设计落地性、环保标准、工程透明度及售后服务的要求持续提升,推动市场向专业化、精细化方向发展。据上海市室内装饰行业协会数据显示,2…

基于天牛须(BAS)与NSGA-Ⅱ混合算法的交直流混合微电网多场景多目标优化调度(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&a…

学长亲荐2026 TOP9 AI论文软件:本科生毕业论文写作全测评

学长亲荐2026 TOP9 AI论文软件&#xff1a;本科生毕业论文写作全测评 2026年AI论文写作工具测评&#xff1a;为何要关注这些工具&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的学术写作工具开始融入AI功能&#xff0c;为本科生提供从选题建议、文献整理到内容…

GESP认证C++编程真题解析 | B4264 [GESP202503 四级] 二阶矩阵

​欢迎大家订阅我的专栏&#xff1a;算法题解&#xff1a;C与Python实现&#xff01; 本专栏旨在帮助大家从基础到进阶 &#xff0c;逐步提升编程能力&#xff0c;助力信息学竞赛备战&#xff01; 专栏特色 1.经典算法练习&#xff1a;根据信息学竞赛大纲&#xff0c;精心挑选…

【心电信号ECG】基于自适应滤波LMS LLMS NLMS从母体心电图提取胎儿心电图附Matlab代码和报告

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

CSDN博客之星2025年度总评选投票~

欢迎给我投票&#x1f44f; 大家好&#xff0c;我是 Moshow&#xff0c;一名热爱技术与分享的Technical Lead & Engineering Lead & 数据科学探索者 & SpringBoot 专家 。 持有多项权威认证&#xff0c;包括&#xff1a; ️ GCA 谷歌云架构师认证 Neo4j 数据科学…

ue5 字典 字典动画 笔记

目录 根据字符串获取动画资产&#xff1a; ue5.5 蓝图怎么创建字典类型变量&#xff1f; ue5.5 没有map类型&#xff0c;建一个变量&#xff0c;类似是String&#xff0c; 在detals中选择字典 value 类型是&#xff1a;Animation Asset 选好后&#xff1a; 字典添加值&#…