力扣 692:巧用小顶堆高效求解前K个高频单词
力扣 692巧用小顶堆高效求解前K个高频单词 前言Bilibili 同步视频 算法核心场景与解题痛点剖析1. 问题场景定义2. 传统解法弊端⚙️ 核心算法原理图文拆解1. 算法整体流程示意图Plain Text2. 分步原理深度解析✅ 第一步哈希表遍历精准统计词频✅ 第二步自定义小顶堆筛选TopK元素✅ 第三步二次规整排序输出标准结果 C 完整可运行代码实现⚡ 算法性能复杂度分析1. 时间复杂度2. 空间复杂度 拓展答疑与学习干货1. 可否用Map替代UnorderedMap2. 直接全局排序可行吗3. 堆排序是最优排序算法吗 编程学习核心感悟 总结 前言在算法刷题与工程开发之中词频统计、高频元素筛选是极为经典的核心场景✨。无论是文本数据分析、关键词提取、日志统计还是LeetCode经典算法题型前K个高频单词的求解思路都是程序员必须掌握的基础高阶算法思维。寻常解题之法多以暴力排序遍历虽逻辑直白却效率堪忧而哈希表统计频次 小顶堆筛选极值的组合解法兼顾时空复杂度优势章法严谨、思路精妙。本文将以骈文雅致之语层层拆解算法核心逻辑附完整C可运行代码、原理流程图解、细节易错点解析带你彻底吃透这一经典算法。Bilibili 同步视频力扣 692巧用小顶堆高效求解前K个高频单词 算法核心场景与解题痛点剖析1. 问题场景定义给定一组单词字符串数组与整数K需求为筛选出数组中出现频次最高的前K个单词排序规则严格遵循双优先级 第一优先级单词出现频次从高到低排序 第二优先级频次相同时按单词字典序从小到大排序2. 传统解法弊端若采用朴素思路先遍历统计所有单词频次再对全部单词直接排序虽可实现功能却存在显著缺陷❌数据量庞大时全局排序时间复杂度极高冗余计算过多无需对所有数据排序仅需保留前K个极值全局排序造成性能浪费是以业界最优解皆依托哈希表小顶堆的组合思想择优选取、去芜存菁以最低时间复杂度实现核心需求✅。⚙️ 核心算法原理图文拆解此番解题之术分三步行云流水、环环相扣哈希表统计词频 → 小顶堆筛选前K元素 → 结果二次规整排序层层递进、逻辑闭环。1. 算法整体流程示意图Plain Text原始单词数组 → 哈希表遍历统计 → 生成【单词-频次】映射关系 ↓ 构建自定义规则小顶堆 → 逐个插入单词元素 → 堆超K则弹出最小值低频单词 ↓ 堆内留存TopK高频单词 → 按题目双规则二次排序 → 输出最终有序结果2. 分步原理深度解析✅ 第一步哈希表遍历精准统计词频天下算法统计为先万物有序数据为基。想要筛选高频单词必先量化每个单词的出现次数。哈希表Hash Map凭借O(1)级别的增删查改效率成为词频统计的最优数据结构。我们以单词为键key、出现频次为值value遍历原始单词数组逐一对对应单词的频次进行累加最终得到所有单词的完整频次映射关系。此步核心要义去重统计、精准量化将无序的原始文本数据转化为结构化的频次数据为后续筛选排序筑牢根基。✅ 第二步自定义小顶堆筛选TopK元素求前K大极值必用小顶堆求前K小极值必用大顶堆。此为算法解题亘古不变的核心准则。为何舍弃大顶堆而选用小顶堆缘由精妙小顶堆堆顶始终为当前堆内最小值元素遍历插入所有单词时若堆中元素数量超出K值直接弹出堆顶低频元素全程保留最优的K个高频单词无需存储全部数据极大节省内存空间。且本题需自定义堆排序规则双维度约束、精准适配题意频次不等频次更高的单词优先级更高频次相等字典序更小的单词优先级更高✅ 第三步二次规整排序输出标准结果小顶堆筛选完成后堆内元素为前K个高频单词但堆结构本身无法保证全局有序。是以最后需对留存元素再次按照「频次降序、字典序升序」的规则排序最终输出完全符合题意的有序结果。 C 完整可运行代码实现依托上述原理结合C STL容器特性编写完整版高效代码注释详尽、可直接编译运行适配各类刷题场景与工程测试#includeiostream#includevector#includeunordered_map#includequeue#includealgorithmusingnamespacestd;// 自定义比较规则适配小顶堆排序逻辑structCMP{// 存储单词与对应频次pairstring,intval;CMP(pairstring,intv):val(v){}// 重载比较运算符构建符合题意的排序规则booloperator(constCMPother)const{// 频次不同频次低的优先弹出小顶堆核心if(val.second!other.val.second){returnval.secondother.val.second;}// 频次相同字典序大的优先弹出保留字典序小的单词returnval.firstother.val.first;}};vectorstringtopKFrequent(vectorstringwords,intk){// 1. 哈希表统计所有单词频次 O(n)unordered_mapstring,intfrequency;for(string word:words){frequency[word];}// 2. 构建自定义小顶堆priority_queueCMPminHeap;for(autoitem:frequency){minHeap.push(CMP(item));// 堆元素超过K弹出频次最小/字典序最大的元素if(minHeap.size()k){minHeap.pop();}}// 3. 提取堆内结果二次规整排序vectorpairstring,inttempRes;while(!minHeap.empty()){tempRes.push_back(minHeap.top().val);minHeap.pop();}// 最终排序频次降序同频次字典序升序sort(tempRes.begin(),tempRes.end(),[](pairstring,inta,pairstring,intb){if(a.second!b.second){returna.secondb.second;}returna.firstb.first;});// 提取最终单词结果vectorstringres;for(autoitem:tempRes){res.push_back(item.first);}returnres;}// 测试主函数intmain(){vectorstringtestWords{i,love,leetcode,i,love,coding};intk2;vectorstringresulttopKFrequent(testWords,k);cout前k个高频单词endl;for(string word:result){coutword ;}return0;}⚡ 算法性能复杂度分析算法之优劣必以时空复杂度为标尺此番解法性能优异、适配海量数据场景1. 时间复杂度词频统计遍历所有单词耗时O(n)n为单词总数堆筛选每个元素入堆、出堆操作耗时 O(logK)总耗时O(nlogK)结果排序仅对K个元素排序耗时O(KlogK)整体复杂度O(nlogK)远优于全局排序的 O(nlogn)2. 空间复杂度哈希表存储所有不重复单词空间 O(m)m为不重复单词数小顶堆仅存储K个元素空间 O(K)整体空间复杂度O(m K)内存占用可控、轻量化高效 拓展答疑与学习干货1. 可否用Map替代UnorderedMap可也但非最优✨。ordered map有序map可自动维护键值有序性但其底层为红黑树增删查改效率低于哈希表。本题无需预处理数据有序性unordered_map 哈希表的无序存储特性更贴合高效统计的核心需求冗余开销更低。2. 直接全局排序可行吗可行但低效❌。全局排序依旧需要先通过哈希表统计词频并未省略核心步骤且海量数据下全局排序的时间开销远大于堆筛选数据量级越大性能差距越明显。3. 堆排序是最优排序算法吗非也。在专业算法与数据结构体系中存在多种优于堆排序、快速排序的高阶排序算法。算法学习的核心不在于死记排序模板而在于掌握场景适配思维——按需择取最优解法方为算法之道。 编程学习核心感悟算法之力为思维之魂代码之力为落地之躯。二者看似独立实则相辅相成、共生共长算法思维决定解题高度代码功底决定落地精度。听课求学重在参悟解题逻辑、搭建思维框架而非拘泥于单一语言的代码细节技能精进贵在躬身实操、线下深耕而非浅尝辄止、线上虚学。C语法晦涩精妙非一书可尽学需多册典籍相辅、千行代码沉淀方能融会贯通、运用自如✨。 总结前K个高频单词的解法以哈希表统计、小顶堆筛选、自定义排序为三重核心化繁为简、去冗存精。相较于暴力排序此算法极大优化时空复杂度是极值类算法场景的经典范式。吃透此番逻辑不仅可秒杀刷题题型更能迁移应用于文本统计、数据筛选、流量分析等各类工程场景切实提升算法思维与代码实战能力

相关新闻

大模型技术 提示词模板 概述

大模型技术 提示词模板 概述

在 LangChain 中,提示词模板(Prompt Template) 是构建大模型应用的核心基石。如果把大模型比作一个“极其聪明但没有记忆的员工”,那么提示词模板就是一份标准化的“工作指南”。它将用户的动态输入与预设的指令、上下文、格式要求…

2026/9/28 18:19:41 阅读更多 →
Agent 设计及实现 demo

Agent 设计及实现 demo

智能体(Agent)系统抽象架构设计文档1. 模型抽象(Model Abstraction)作为 Agent 的“大脑皮层”,本层负责屏蔽不同大模型厂商的 API 差异,提供统一的调用接口。Function Call 标准化:统一解析 Op…

2026/9/29 10:07:37 阅读更多 →
硬件电路可靠性验证:环路稳定性与温升测试的工程实践指南

硬件电路可靠性验证:环路稳定性与温升测试的工程实践指南

这次我们来看一个硬件电路设计中的核心实践话题:环路稳定性与温升测试。对于电源工程师、硬件开发者和电子爱好者来说,这两个测试是评估电路可靠性、确保产品长期稳定工作的关键环节。它不是某个具体的开源软件项目,而是一套必须掌握的工程验…

2026/10/12 1:49:24 阅读更多 →

最新新闻

Cesium自建地形数据实战:从DEM到量化网格瓦片

Cesium自建地形数据实战:从DEM到量化网格瓦片

搞Cesium开发,最绕不开的一件事就是地形数据。默认的在线地形服务虽然打开就能用,可真到了项目落地,总有让你必须自己生成地形数据的理由——精度不够、网络受限、数据不能离开本机。这篇博客把完整跑过一次的Cesium地形数据生成过程记录下来…

2026/10/15 17:50:05 阅读更多 →
SDL2-devel 2.30.1 MinGW 包:LVGL 模拟器编译与避坑指南

SDL2-devel 2.30.1 MinGW 包:LVGL 模拟器编译与避坑指南

简介:本资源为SDL2-devel-2.30.1-mingw.zip开发依赖包,面向在VSCode中搭建LVGL模拟器的嵌入式与GUI开发者,用于解决Windows环境下编译LVGL仿真工程时缺少SDL2库文件的问题。压缩包共414个文件,约15.29MB,包含160个h头文…

2026/10/15 17:50:05 阅读更多 →
ADXL357高精度驱动开发:SPI时序控制与温度补偿实战

ADXL357高精度驱动开发:SPI时序控制与温度补偿实战

简介:本资源是面向嵌入式开发工程师与STM32初学者的ADXL357高精度MEMS加速度传感器驱动实现包,专为解决STM32平台下该传感器快速集成与数据采集难题而设计。压缩包共5个文件,含3个头文件(.h)负责寄存器定义、接口声明与…

2026/10/15 17:50:05 阅读更多 →
ADXL357.rar工程包解析:高精度惯性传感器寄存器级调试指南

ADXL357.rar工程包解析:高精度惯性传感器寄存器级调试指南

简介:本资源是面向嵌入式开发工程师与STM32初学者的ADXL357高精度MEMS加速度传感器驱动实现包,专为解决传感器在ARM Cortex-M平台上的快速集成与可靠通信问题而设计。压缩包共5个文件(3个.h头文件、2个.c源文件),总大小…

2026/10/15 17:50:05 阅读更多 →
MT5 与 Python 行情接口对接:历史数据获取及常见报错排查

MT5 与 Python 行情接口对接:历史数据获取及常见报错排查

一、背景在量化研究与策略回测中,行情数据的质量直接决定了结果的可信度。MT5 终端本身提供完整的历史 K 线与实时报价,但研究者往往更习惯在 Python 生态中完成数据分析与建模。通过官方提供的 Python 接口模块,可以把终端里的行情数据以编程…

2026/10/15 17:50:05 阅读更多 →
基于C++的USB通信上位机开发:从枚举到批量传输的完整实现

基于C++的USB通信上位机开发:从枚举到批量传输的完整实现

简介:这是一份面向C开发者与嵌入式方向学习者的USB通信上位机完整工程源码,聚焦于通过C实现与USB设备的数据交互,涵盖设备枚举、驱动初始化、异步数据传输、错误处理及图形界面等核心模块,适合希望深入理解USB协议与底层硬件操作的…

2026/10/15 17:49:04 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →