前K个高频元素:算法面试与工程实践详解
1. 问题背景与核心挑战最近在准备算法面试的同学一定对前K个高频元素这个问题不陌生。这是力扣LeetCode热题100中的经典题目编号为347。在实际工作中类似场景也经常出现——比如统计用户行为日志中的高频操作、分析系统监控数据中的异常峰值等。这个问题的核心是给定一个整数数组nums和一个整数k返回数组中出现频率前k高的元素。看似简单但要在面试场景下写出最优解需要综合运用多种数据结构和算法思想。我在大厂面试中多次遇到这个问题的变种也见证过不少候选人在这里翻车。2. 解法思路分析与比较2.1 暴力解法统计排序最直观的思路分两步用哈希表统计每个元素出现频率对统计结果排序后取前k个def topKFrequent(nums, k): count {} for num in nums: count[num] count.get(num, 0) 1 sorted_items sorted(count.items(), keylambda x: -x[1]) return [x[0] for x in sorted_items[:k]]时间复杂度分析统计阶段O(n)遍历排序阶段O(m log m)其中m是不同元素的数量当m接近n时比如所有元素都不同退化为O(n log n)注意虽然这个解法能通过力扣测试但在面试中只能算及格分。面试官通常会追问优化方案。2.2 优化方向堆的妙用更优的解法是使用最小堆Min Heap同样先用哈希表统计频率维护一个大小为k的最小堆遍历统计结果保持堆中始终是当前看到的前k大元素import heapq def topKFrequent(nums, k): count {} for num in nums: count[num] count.get(num, 0) 1 heap [] for num, freq in count.items(): if len(heap) k: heapq.heappush(heap, (freq, num)) else: if freq heap[0][0]: heapq.heappop(heap) heapq.heappush(heap, (freq, num)) return [x[1] for x in heap]时间复杂度优化为O(n m log k)当k远小于m时优势明显。这也是面试官期望看到的解法。3. 最优解快速选择算法3.1 算法原理更进一步我们可以使用快速选择Quickselect算法这是快速排序的变种统计频率后得到唯一元素数组和对应频率数组对频率数组进行快速选择找到第k大的频率阈值收集所有频率大于等于该阈值的元素def topKFrequent(nums, k): count {} for num in nums: count[num] count.get(num, 0) 1 unique list(count.keys()) def partition(left, right, pivot_index): pivot_freq count[unique[pivot_index]] # 把pivot移到末尾 unique[pivot_index], unique[right] unique[right], unique[pivot_index] store_index left for i in range(left, right): if count[unique[i]] pivot_freq: unique[store_index], unique[i] unique[i], unique[store_index] store_index 1 # 把pivot移回最终位置 unique[right], unique[store_index] unique[store_index], unique[right] return store_index def quickselect(left, right, k_smallest): if left right: return pivot_index random.randint(left, right) pivot_index partition(left, right, pivot_index) if k_smallest pivot_index: return elif k_smallest pivot_index: quickselect(left, pivot_index - 1, k_smallest) else: quickselect(pivot_index 1, right, k_smallest) n len(unique) quickselect(0, n - 1, k - 1) return unique[:k]时间复杂度优化到平均O(n)最坏情况O(n^2)但可以通过随机化避免。3.2 算法选择建议在实际面试中优先实现堆解法最容易讲清楚如果面试官追问再讨论快速选择方案可以提到桶排序作为备选当数据范围已知且较小时适用4. 边界条件与测试用例4.1 必须考虑的边界情况k等于数组长度返回所有元素所有元素频率相同数组中只有一个元素重复多次k1的特殊情况大数测试验证算法效率4.2 推荐测试用例测试用例1: 常规情况 nums [1,1,1,2,2,3], k 2 预期输出: [1,2] 测试用例2: 所有元素相同 nums [1,1,1,1], k 1 预期输出: [1] 测试用例3: k等于数组长度 nums [4,1,-1,2,-1,2,3], k 4 预期输出: [-1,2,4,1]顺序不重要 测试用例4: 大数测试 nums [random.randint(1,10000) for _ in range(100000)], k10 预期输出: 频率最高的10个数5. 实际工程中的应用变种这个问题在工程实践中有很多变种实时Top K统计使用计数布隆过滤器堆的组合分布式环境下的Top KMapReduce实现方案滑动窗口Top K结合时间衰减因子带权重的Top K元素有不同的重要性权重以实时统计为例一个典型架构是前端埋点收集用户行为Kafka消息队列缓冲数据Spark Streaming实时处理使用类似算法计算每分钟/小时的Top K事件6. 面试技巧与常见误区6.1 面试回答模板先确认问题细节k的范围元素类型频率相同如何处理提出暴力解法并分析复杂度逐步优化讨论堆和快速选择方案比较各种方法的适用场景编写代码时边写边解释主动设计测试用例验证6.2 常见错误忘记处理频率相同的情况堆的实现错误特别是用最大堆而不是最小堆快速选择时边界条件处理不当没有考虑时间复杂度随k变化的情况代码可读性差变量命名混乱缺乏注释7. 扩展练习建议为了真正掌握这类问题建议练习以下变种题力扣692. 前K个高频单词增加了字典序要求力扣973. 最接近原点的K个点距离作为排序依据力扣451. 根据字符出现频率排序全排序而非Top K力扣215. 数组中的第K个最大元素基础版快速选择我在准备面试时会专门建立一个Top K问题的专题笔记记录各种变种和解法。这个习惯帮助我在面对新问题时能快速联想到相似模式。

相关新闻

Excel VBA编程入门:从宏录制到自动化办公实战指南

Excel VBA编程入门:从宏录制到自动化办公实战指南

1. 项目概述:为什么我建议你从Excel VBA开始学编程 如果你每天的工作都离不开Excel,处理着大量重复的复制粘贴、数据清洗、报表生成,那么“Excel VBA学习”这个项目,对你来说可能价值千金。这不是一个简单的“学个新技能”&#x…

2026/8/26 12:41:02 阅读更多 →
Excel VBA自动化实战:从宏录制到系统化编程,解放重复劳动

Excel VBA自动化实战:从宏录制到系统化编程,解放重复劳动

1. 项目概述:为什么今天还要学Excel VBA?如果你每天的工作都离不开Excel,处理着成百上千行的数据,重复着筛选、复制、粘贴、汇总、生成报表这些枯燥的步骤,那么你很可能已经无数次想过:“要是能有个机器人帮…

2026/8/26 12:41:02 阅读更多 →
LangGraph状态管理:构建AI应用会话记忆系统的核心技术

LangGraph状态管理:构建AI应用会话记忆系统的核心技术

1. 从“健忘”到“有记忆”:为什么AI应用需要会话记忆 如果你用过早期的聊天机器人,或者一些功能简陋的AI助手,一定有过这样的体验:你问它“我昨天提到的那个项目方案,你觉得怎么样?”,它却一脸…

2026/8/26 12:41:02 阅读更多 →

最新新闻

Agent岗位面试高频问题与实战解决方案

Agent岗位面试高频问题与实战解决方案

1. Agent岗位面试高频问题深度解析 最近面试了几家公司的Agent相关岗位,发现面试官的问题都集中在几个核心方向。作为过来人,我把这些高频问题整理成了一份实战指南,希望能帮助准备面试的朋友们。 1.1 框架选型:ReAct vs Plan-a…

2026/8/26 13:07:23 阅读更多 →
PyTorch与TensorFlow实现PINN:一维热传导方程实战教程

PyTorch与TensorFlow实现PINN:一维热传导方程实战教程

各位读者朋友,大家好。上一篇我们完成了 PINN 入门 30 讲系列课程的基础理论部分,很多同学留言反馈说:理论看懂了,但一打开编辑器就不知道从哪里开始写代码。今天这篇内容,就帮大家彻底解决这个问题。本文将围绕物理信…

2026/8/26 13:07:23 阅读更多 →
用户价值分析最小闭环:从埋点到RFM分群与流失预警

用户价值分析最小闭环:从埋点到RFM分群与流失预警

“不知道用户有什么用就扫走吧”,这句话我在不少产品评审会上都听见过。说这句话的人,往往并不坏,只是拿不出更好的依据。团队既没有完整的行为埋点,也没有清晰的用户标签,更没有人能说清楚“一个用户从注册到流失&…

2026/8/26 13:07:23 阅读更多 →
Windows隐私清理与C盘空间释放:PrivaZer深度实战指南

Windows隐私清理与C盘空间释放:PrivaZer深度实战指南

这次我们来看一个免费又比较能打的 Windows 隐私清理工具:PrivaZer。 它解决的问题很直接:电脑里到处是浏览器历史、Cookie、最近打开的文档记录、回收站残留、临时文件。这些痕迹不仅暴露你的使用习惯,有的还包含账号信息,二手电…

2026/8/26 13:07:23 阅读更多 →
CodeX+Ollama+Coze:从智能体调用到可复用流水线的工程落地指南

CodeX+Ollama+Coze:从智能体调用到可复用流水线的工程落地指南

我知道你大概率不是想再要一篇“三个工具的安装教程汇总”。市面上这类文章已经很多了,而且大多数看完你会发现一个问题:工具各自都会用了,组合起来还是不知道怎么落地。我写这篇文章,想先给一个判断:CodeX、Ollama、C…

2026/8/26 13:07:22 阅读更多 →
大规模MIMO信道估计:LS、OMP、MOMP、CoSaMP仿真对比与性能解析

大规模MIMO信道估计:LS、OMP、MOMP、CoSaMP仿真对比与性能解析

大规模 MIMO 信道估计到底怎么做?为什么很多论文里 LS 和 OMP 的差距那么大,自己仿真却对不上?这是最近不少读者在后台问的问题。尤其在 5G 和未来的 6G 研究里,大规模 MIMO 系统的信道估计直接决定了波束赋形和预编码的性能&…

2026/8/26 13:06:22 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →