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

堆 / 优先队列专题二刷笔记:前 K 个高频元素 数据流的中位数

目录一、LeetCode 347. 前 K 个高频元素中等题目描述核心思路方法 1小顶堆推荐时间复杂度 O (n log k)方法 2大顶堆写法简单但效率略低代码实现Java 小顶堆版二刷复盘要点二、LeetCode 295. 数据流的中位数困难题目描述核心思路双堆法经典模板代码实现Java二刷复盘要点三、两道题的核心模板总结这两道题是堆优先队列的「面试双杀」也是我自己二刷时的重点复盘题帮你把核心模板和易错点一次性吃透。一、LeetCode 347. 前 K 个高频元素中等题目描述给你一个整数数组nums和一个整数k请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。核心思路这道题的核心是 **「统计频率 用堆筛选前 K 大」**二刷时一定要掌握两种写法的区别方法 1小顶堆推荐时间复杂度 O (n log k)统计频率用 HashMap 统计每个数字出现的次数。维护小顶堆堆的大小始终不超过k。遍历所有频率当堆大小小于k时直接入堆当堆大小等于k时如果当前频率大于堆顶元素则弹出堆顶、压入当前元素。结果收集遍历结束后堆中剩下的k个元素就是频率最高的前k个。方法 2大顶堆写法简单但效率略低直接把所有元素按频率压入大顶堆然后弹出前k个即可。但时间复杂度为 O (n log n)在数据量大时效率不如小顶堆。代码实现Java 小顶堆版java运行public int[] topKFrequent(int[] nums, int k) { // 1. 统计频率 MapInteger, Integer freqMap new HashMap(); for (int num : nums) { freqMap.put(num, freqMap.getOrDefault(num, 0) 1); } // 2. 小顶堆按频率升序排列堆顶是当前频率最小的元素 PriorityQueueMap.EntryInteger, Integer minHeap new PriorityQueue(Comparator.comparingInt(Map.Entry::getValue)); for (Map.EntryInteger, Integer entry : freqMap.entrySet()) { if (minHeap.size() k) { minHeap.offer(entry); } else { if (entry.getValue() minHeap.peek().getValue()) { minHeap.poll(); minHeap.offer(entry); } } } // 3. 收集结果 int[] res new int[k]; int idx 0; while (!minHeap.isEmpty()) { res[idx] minHeap.poll().getKey(); } return res; }二刷复盘要点为什么用小顶堆而不是大顶堆因为小顶堆的大小始终是k堆操作的时间复杂度是 O (log k)整体效率更高。易错点堆的比较器要写对小顶堆是按频率升序而不是按元素本身的值排序。二、LeetCode 295. 数据流的中位数困难题目描述中位数是有序列表中间的数。如果列表长度是偶数中位数是中间两个数的平均值。设计一个支持addNum和findMedian操作的数据结构addNum(int num)从数据流中添加一个整数到数据结构中。findMedian()返回目前所有元素的中位数。核心思路双堆法经典模板用两个堆分别维护数据的左右两半大顶堆left存储前半部分数据堆顶是前半部分的最大值。小顶堆right存储后半部分数据堆顶是后半部分的最小值。维护规则大顶堆的大小要么和小顶堆相等要么比小顶堆多 1保证奇数长度时大顶堆的堆顶就是中位数。每次添加元素时先根据元素大小判断该加入哪个堆再调整两个堆的大小保持平衡。代码实现Javajava运行class MedianFinder { // 大顶堆存储前半部分堆顶是前半部分的最大值 private PriorityQueueInteger left; // 小顶堆存储后半部分堆顶是后半部分的最小值 private PriorityQueueInteger right; public MedianFinder() { left new PriorityQueue((a, b) - b - a); right new PriorityQueue(); } public void addNum(int num) { // 先决定加入哪个堆 if (left.isEmpty() || num left.peek()) { left.offer(num); } else { right.offer(num); } // 调整堆的大小保持平衡 // 情况1大顶堆比小顶堆多2个需要把大顶堆的堆顶移到小顶堆 if (left.size() right.size() 1) { right.offer(left.poll()); } // 情况2小顶堆比大顶堆多需要把小顶堆的堆顶移到大顶堆 else if (right.size() left.size()) { left.offer(right.poll()); } } public double findMedian() { // 奇数个元素大顶堆的堆顶就是中位数 if (left.size() right.size()) { return left.peek(); } // 偶数个元素取两个堆顶的平均值 else { return (left.peek() right.peek()) / 2.0; } } }二刷复盘要点两个堆的作用是什么大顶堆维护左半部分小顶堆维护右半部分这样两个堆顶就是整个数据的中间两个数取中位数的时间复杂度是 O (1)。易错点堆的大小调整逻辑一定要写对尤其是大顶堆和小顶堆的大小关系否则会导致中位数计算错误。面试常问除了双堆法还有没有其他方法如二分查找维护有序数组但插入时间复杂度是 O (n)效率不如双堆法三、两道题的核心模板总结表格题目核心数据结构关键技巧时间复杂度前 K 个高频元素HashMap 小顶堆维护堆大小不超过 k效率最优O(n log k)数据流的中位数大顶堆 小顶堆双堆平衡堆顶直接取中位数addNum: O(log n), findMedian: O(1)

相关文章:

堆 / 优先队列专题二刷笔记:前 K 个高频元素 数据流的中位数

目录 一、LeetCode 347. 前 K 个高频元素(中等) 题目描述 核心思路 方法 1:小顶堆(推荐,时间复杂度 O (n log k)) 方法 2:大顶堆(写法简单,但效率略低) …...

AI跑分飙升却无人问津,“说人话”才是模型出圈关键!

四月AI新动态四月,Anthropic发布Opus 4.7,OpenAI发布GPT 5.5,DeepSeek更新V4。三家公司发布通稿显示跑分、上下文、推理和代码能力提升,但互联网反应平淡,社交媒体讨论热度低,仅OpenAI的GPT - image出圈&am…...

小林大模型|大模型面试高频知识点合集2

什么是 Agent?与大模型有什么本质不同? 面试时答这道题,一定要点出三件事:一是 Agent 有自主规划能力,给它一个复杂目标它能自己拆解成多步;二是它能行动,通过工具调用跟外部世界真实交互&…...

急急急急急急急急哦吼吼吼叫

测试22333333...

免费解锁Windows虚拟显示器:Parsec VDD完整指南,游戏直播与远程办公的终极解决方案

免费解锁Windows虚拟显示器:Parsec VDD完整指南,游戏直播与远程办公的终极解决方案 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 你是否曾为远程服务器缺…...

R语言生态学入门:用rgbif包5分钟搞定GBIF物种分布数据下载(以十大功劳属为例)

R语言生态学入门:用rgbif包5分钟搞定GBIF物种分布数据下载(以十大功劳属为例) 当你在生态学研究中需要快速获取某个物种的全球分布数据时,GBIF(全球生物多样性信息网络)无疑是最权威的数据源之一。但对于刚…...

HTTP基础教程:请求方法、状态码、JSON、鉴权、超时、重试与流式返回

title: “HTTP基础教程:请求方法、状态码、JSON、鉴权、超时、重试与流式返回” date: 2026-04-28 tags: HTTPPythonAPIJSONFastAPIrequests description: “一篇面向初学者的 HTTP 基础博客教程,系统介绍请求方法、状态码、JSON、鉴权、超时、重试和流式…...

DeepAgents智能体

DeepAgents是LangChain 官方发布的 Agent 框架,基于 LangChain LangGraph 构建, 灵感直接来源于 Claude Code——官方 README 里明确写道, 这个项目"最初很大程度上是一次尝试,探究是什么让 Claude Code 如此通用&#xff0…...

如何轻松地将短信从 OnePlus 传输到 iPhone?

从一加这样的Android设备换 到 iPhone固然令人兴奋,但重要的短信怎么办呢?许多用户担心在换机过程中丢失短信历史记录。好在有几种方法可以让你安全高效地将短信从一加转移到 iPhone。本指南将引导你了解一些行之有效的解决方案。第 1 部分。如何通过移动…...

Arm Cortex-A720处理器错误分析与解决方案

1. Arm Cortex-A720处理器错误概述在处理器设计领域,硬件错误(Errata)是每个芯片开发者都需要面对的挑战。Arm Cortex-A720作为高性能计算的核心组件,其设计复杂度带来了某些特定场景下的异常行为。这些错误并非设计缺陷&#xff…...

榨干GD32F470性能:巧用SDRAM+SPI DMA,实现240x280 TFT屏的60FPS流畅动画

榨干GD32F470性能:SDRAMSPI DMA驱动TFT屏的60FPS优化实战 当你在嵌入式系统中需要实现流畅的UI动画时,内存带宽和处理器性能往往成为瓶颈。GD32F470这颗Cortex-M4内核的MCU,配合外置SDRAM和SPI DMA,却能突破内部RAM限制&#xff0…...

告别爆显存!实测Stable Diffusion v1-4模型在低配GPU上的最小化运行参数指南

低配GPU玩转Stable Diffusion:4GB显存极限优化实战手册 当我在自己的旧笔记本上第一次尝试运行Stable Diffusion时,那个刺眼的"CUDA out of memory"错误提示几乎浇灭了我的热情。但经过两周的反复试验和参数调整,我成功让这个拥有4…...

智能运维+多模型服务能力,阿里云 RDS AI 助手旗舰版正式上线!

数据库运维团队常常面临两大难题:一是混杂在阿里云、自建和他云上的各类数据库难以统一管理;二是想利用大模型能力提升运维效率,却要分别对接多个厂商的 API、管理多套密钥、承担高昂的集成成本。 RDS AI 助手旗舰版在 RDS AI 助手专业版智能…...

从CAN波特率索引表到寄存器:一份给嵌入式新手的底层配置原理图解

从CAN波特率索引表到寄存器:嵌入式开发的底层配置逻辑拆解 刚接触CAN总线的开发者,面对波特率配置时往往会遇到一个困惑:为什么有些开发板直接给出一张索引值对照表,而有些手册却要求手动配置7个寄存器?这两种方式背后…...

如何用MusicFree插件系统打破音乐平台壁垒:完整免费音乐聚合指南

如何用MusicFree插件系统打破音乐平台壁垒:完整免费音乐聚合指南 【免费下载链接】MusicFreePlugins MusicFree播放插件 项目地址: https://gitcode.com/gh_mirrors/mu/MusicFreePlugins 你是否厌倦了在不同音乐平台间来回切换?是否因为会员限制而…...

【Docker WASM边缘部署终极指南】:20年架构师亲授3大避坑法则、4层架构图与实时性能调优参数

更多请点击: https://intelliparadigm.com 第一章:Docker WASM边缘部署的演进逻辑与核心价值 WebAssembly(WASM)正从浏览器沙箱走向通用轻量运行时,而 Docker 官方对 WASM 的原生支持(自 2023 年 Docker D…...

本地mysql密码重置

第一步:准备工作关闭所有和 MySQL、DBeaver、CMD 相关的窗口,从头开始。如图:winR打开如下面板,然后确认找到正在运行的mysql服务,然后右键停止。以管理员身份打开 2 个「命令提示符」窗口(右键 CMD → 以管…...

若依(RuoYi-Vue)代码生成器实战:从零掌握单表CURD开发

前言若依框架是国内最流行的Spring Boot后台管理系统之一,其强大的代码生成器可以让我们告别繁琐的增删改查开发,只需几步操作就能生成完整的业务代码。本文将完整记录使用若伊代码生成器完成单表CURD的全流程,并分享实际开发中遇到的各种&qu…...

【LSTM回归预测】基于matlab改进的量子粒子群自适应算法ASL-QPSO优化LSTM循环神经网络的数据回归预测【含Matlab源码 15397期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…...

别再死记硬背Flink CEP API了!图解‘严格连续’、‘松散连续’到底差在哪?

Flink CEP实战:图解严格连续与松散连续的本质差异 1. 复杂事件处理的核心挑战 在实时数据处理领域,Flink CEP(Complex Event Processing)是检测事件流中特定模式的利器。但许多开发者在实际使用中常陷入一个误区:死记硬…...

【Linux从入门到精通】第27篇:文本处理三剑客(上)——grep 正则表达式实战

目录 一、引言:从“找东西”说起 二、grep基础:从简单搜索开始 2.1 基本语法 2.2 常用基础选项 2.3 管道中的grep 三、正则表达式:从“搜文字”到“搜模式” 3.1 两种正则标准:BRE与ERE 3.2 基础元字符 3.3 扩展正则&…...

STM32 I2S 输入输出切换功能 - 修改总结

一、问题背景 使用 STM32F4 的 I2S 接口实现音频输入(录音)和输出(播放)切换。原始代码 HAL_I2S_Receive_DMA() 能正常接收数据,但自定义的 I2S_Start_RX() 函数切换到输入模式后数据全为0。二、修改文件清单 1. MY_I2…...

制造业成本困局:大宗材料价格波动如何破局

在制造业的日常运营中,原材料成本始终是绕不开的核心话题。尤其是铜、铝、锡、银等大宗材料,其价格波动如同过山车,让企业采购部门时刻紧绷神经。每天数万甚至数十万的隐性成本风险,像一把悬在头顶的达摩克利斯之剑,让…...

我的世界开服神器!土豆互联公益免费 4H8G 面板服太香了

我的世界开服神器!土豆互联公益免费 4H8G 面板服太香了 经常玩我的世界的小伙伴应该都知道,想要和好朋友一起联机游玩,自建服务器是最好的选择。但市面上的服务器要么价格昂贵,要么免费配置极低,运行大型模组整合包就…...

VS Code Copilot Next 工作流配置不是“开箱即用”,而是“开箱即崩”?揭露GitHub Copilot Teams v2.12.0+中3个高危默认配置项及紧急热修复补丁

更多请点击: https://intelliparadigm.com 第一章:VS Code Copilot Next 自动化工作流配置不是“开箱即用”,而是“开箱即崩”? VS Code Copilot Next(v1.12)在启用自动化工作流(如 copilot:ru…...

六个典型热门AI记忆架构对比:Mem0,Letta,MemoryLake,ZenBrain,MIA,MSA 助你快速选型

开篇:AI记忆赛道的概念迷雾2026年,AI Agent赛道的竞争焦点已从基础模型性能转向记忆能力——当通用大模型的智能水平差距越来越小,能否像人类一样主动存储、筛选、巩固记忆,甚至形成用户个性化的用户记忆进而形成人格,…...

【限时公开】微软内部未文档化Copilot Next配置密钥:启用LLM上下文预加载、指令流管道并行化与GPU卸载开关

更多请点击: https://intelliparadigm.com 第一章:VS Code Copilot Next 自动化工作流配置 性能调优指南 启用 Copilot Next 并验证环境兼容性 确保已安装 VS Code 1.85 版本及官方 Copilot Next 扩展(ID: github.copilot-next)…...

Antigravity Retry 自动重试脚本

Antigravity Retry 自动重试脚本代码setInterval(() > {const card Array.from(document.querySelectorAll(div)).find(div > div.innerText.includes(Agent terminated due to error));if (!card) return;const retryBtn Array.from(card.querySelectorAll(button)).f…...

生产节拍混乱,在制品积压严重该怎么破解?——2026制造业柔性生产与Agent自动化实战指南

在2026年的工业4.0深化阶段,制造企业面临的市场环境已发生剧变。 消费者对个性化、定制化产品的需求,迫使工厂从“大批量流水线”全面转向“小批量、多批次”的柔性生产模式。 然而,许多企业在转型中陷入了生产节拍混乱与在制品(W…...

百度网盘CLI终极指南:从零构建高效命令行文件管理方案

百度网盘CLI终极指南:从零构建高效命令行文件管理方案 【免费下载链接】BaiduPCS-Go 项目地址: https://gitcode.com/gh_mirrors/baid/BaiduPCS-Go 在无图形界面的服务器环境中管理百度网盘数据,传统客户端显得力不从心。BaiduPCS-Go作为一款强大…...