LeetCode 2080 区间频率查询详解(哈希表 + 二分法)

深度解析:空间换时间的艺术 —— 从区间频率查询看哈希与二分

在处理大规模数据查询时,性能优化是核心。LeetCode 2080 题《区间内查询数字的频率》是一个绝佳的案例。本文将通过“哈希表预处理”与“二分查找”两大维度,带你领略现代 C++ 的解题美学。

一、 哈希表:构建高效的“档案库”

在本题中,如果我们每次查询都遍历区间,时间复杂度是 O(N),面对 10^5 级别的查询必然超时。我们的策略是构建一个 unordered_map<int, vector>。

1. 结构深度解析

这个结构可以理解为一个“分类索引”:

  • Key (键):数组中出现的具体数值(如 33)。
  • Value (值):一个升序排列的 vector,记录了该数值在原数组中出现的所有下标(如 [1, 3, 5])。

2. 增删改查的实战用法

在 C++ 中,unordered_map 是基于哈希表实现的,其平均操作效率为 O(1):

  • 增/改:

    pos[val].push_back(index); // 若 val 不存在,会自动创建一个空的 vector 并添加 index
  • 查(标准定式):
    为了避免不必要的插入(副作用),推荐使用 find() 配合 end() 进行检查:

    auto it = pos.find(target); if (it != pos.end()) { // 找到了,it->second 就是我们要的下标 vector }
  • 删:

pos.erase(val); // 即可瞬间根据键删除对应的内容。

3. 性能关键

在查询函数中,你会看到这样的代码:

auto& a = it->second;
  • 为什么要加 &?
  • 如果不加 &,程序会把整个 vector 拷贝一遍。加上 & 后,a 仅仅是原哈希表中 vector 的一个别名,没有任何数据复制。在处理海量数据时,这一个字符之差就是 TLE(超时)与 AC(通过)的分水岭。

二、 二分查找

有了有序的下标数组后,核心任务就是:在有序数组中,统计有多少个下标落在 [left, right] 之间。此时,std::lower_bound 和 std::upper_bound 就派上用场了。

1. lower_bound:定位左边界

  • 功能:在有序序列中找到第一个 大于等于 (>=) 给定值的元素位置。
  • 应用:lower_bound(a, left) 帮我们找到第一个落在区间内的有效下标位置。

2. upper_bound:定位右边界

  • 功能:在有序序列中找到第一个 严格大于 (>) 给定值的元素位置。
  • 应用:upper_bound(a, right) 帮我们找到第一个“越出”右边界的位置。

3. 核心计算公式

两个迭代器相减,即是该数值在区间内出现的次数:

return ranges::upper_bound(a, right) - ranges::lower_bound(a, left);

三、 完整实现代码 (C++20 风格)

class RangeFreqQuery { // 哈希表:数值 -> 有序下标数组 unordered_map<int, vector<int>> pos; public: RangeFreqQuery(vector<int>& arr) { // 预处理:O(N) 建立索引 for (int i = 0; i < arr.size(); ++i) { pos[arr[i]].push_back(i); // 顺序遍历确保了下标序列是天然升序的 } } int query(int left, int right, int value) { // 使用定式查找,避免副作用 auto it = pos.find(value); if (it == pos.end()) return 0; // 数值根本没出现过 // 获取引用 (&),拒绝大规模拷贝 const auto& a = it->second; // 二分查找:O(log M) auto L = std::ranges::lower_bound(a, left); auto R = std::ranges::upper_bound(a, right); return R - L; // 迭代器相减得到元素个数 } };

四、 总结

本题是典型的“空间换时间”策略。我们通过哈希表将乱序数组按值分类,再通过二分法将线性搜索优化为对数搜索。

关键点回顾:

  1. 哈希表:掌握 find 定式,通过 Key 瞬间定位数据。
  2. 引用 &:它是 C++ 程序员的性能尊严,拒绝无谓拷贝。
  3. 二分边界:记住 lower 是第一个“不小于”,upper 是第一个“大于”。

相关链接:https://github.com/0voice

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

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

相关文章

彻底搞懂浏览器原生录制:MediaRecorder API 深度解析

在现代 Web 开发中&#xff0c;音视频处理能力的边界正在不断扩展。过去依赖 Flash 或 Silverlight 插件才能实现的录制功能&#xff0c;如今已成为浏览器的原生能力。MediaRecorder API 正是这一变革的核心&#xff0c;它允许开发者直接在浏览器端捕获、编码并保存媒体流&…

AI大模型架构师必学指南:从知识储备到高薪前景,一篇收藏就够了!

AI大模型架构师是连接AI理论与产业落地的关键角色&#xff0c;需融合深度学习、分布式系统、软件工程等多领域知识。该岗位涵盖模型训练、部署与系统架构设计&#xff0c;要求兼具技术创新能力与行业洞察力。随着大模型在各行业广泛应用&#xff0c;人才需求激增&#xff0c;一…

IoT 场景中的 DHCP、ARP、ICMP 到底在干嘛?

&#x1f310; IoT 场景中的 DHCP、ARP、ICMP 到底在干嘛&#xff1f;连上 WiFi ≠ 能通信&#xff0c;真正的网络刚刚开始在 IoT 开发中&#xff0c;你一定见过这些现象&#xff1a; ESP32 显示 WiFi 已连接&#xff0c;但服务器连不上MQTT / HTTP 超时&#xff0c;但 TCP/IP …

MySql-9.1.0安装详细教程(保姆级)

目录 MySQL介绍&#xff1a; 一、下载 Mysql 安装文件 二、Mysql 安装教程 1.下载完成后进入解压&#xff0c;注意不要放在一个非中文路径下的文件夹下面否则后面会报错。我在此处解压放在了D盘MySQL目录下。 2.解压后的文件应该没有.ini文件。因此&#xff0c;需要创建in…

AI产品经理转型与大模型学习路线图,附赠全套学习资源_月薪3W的AI产品经理学习路线

文章提供了AI产品经理和大模型工程师的完整学习路线。AI产品经理路线包括基础知识、专业技能和软技能三大阶段&#xff0c;涵盖AI技术、产品管理等核心能力。大模型学习路线包括系统设计、提示词工程、平台应用开发等七个阶段&#xff0c;并提供相关学习资源。文章强调理论与实…

大模型学习宝典:从小白到专家的进阶之路,建议收藏反复阅读

文章介绍了大模型的基本概念、分类和应用场景&#xff0c;详细解释了大模型的训练过程&#xff08;预训练和微调&#xff09;&#xff0c;分析了当前"百模大战"的发展趋势及面临的挑战&#xff0c;包括失业、版权、偏见、犯罪和能耗等问题。大模型作为AI的重要发展方…

主流AI平台用户占55%,SHEEP-GEO凭五维模型成企业AI搜索战略伙伴

2026年&#xff0c;中国GEO&#xff08;生成式引擎优化&#xff09;市场迎来爆发式增长&#xff0c;行业预测显示市场规模将突破520亿元&#xff0c;同比增幅超190%。这一增长背后&#xff0c;是AI平台用户渗透率的快速提升——DeepSeek、豆包、元宝等主流平台用户占比已超55%&…

【ITK手册006】itk::Point 深度解析与实用指南

【ITK手册006】itk::Point 深度解析与实用指南 0. 概述 在 ITK (Insight Segmentation and Registration Toolkit) 的几何框架中&#xff0c;itk::Point 是最基础的类之一。它用于表示 n 维欧几里得空间中的一个静态位置&#xff08;坐标&#xff09;。 与 itk::Vector&#xf…

MySQL 时区参数 time_zone 详解

文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用&#xff1f;修改它有什么影响&#xff1f;如何设置该参数&#xff0c;本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT C…

量化交易脚本开发:DeepSeek生成技术指标计算与信号触发代码

量化交易的核心在于将交易规则和策略转化为计算机可执行的代码。其中&#xff0c;技术指标的计算和基于这些指标生成交易信号是策略实现的基础环节。本文将深入探讨如何从零开始开发量化交易脚本&#xff0c;重点聚焦于常见技术指标的计算逻辑以及如何基于这些指标设计并实现信…

MySQL 数据增删改查

一、插入数据 1.1 insert插入数据 &#xff08;1&#xff09;insert语法格式 INSERT [INTO] 表名 [字段名] VALUES (值列表);&#xff08;2&#xff09;示例 ① 向学生表中插入一行数据② 向学生表中插入多行数据二、更新数据 2.1 update更新数据 &#xff08;1&#xff09;…

RAG Agent记忆功能完全指南:3种方法解决长对话上下文丢失问题

本文介绍了为RAG Agent添加记忆功能的实现方法&#xff0c;重点讲解了如何通过消息列表实现短期记忆&#xff0c;以及解决长对话导致的上下文窗口限制问题&#xff0c;包括截断、删除和总结消息三种方法&#xff0c;并介绍了如何自定义AgentState来增强记忆能力&#xff0c;帮助…

Ehercat代码解析中文摘录<8>

12 工具从站协议栈代码工具允许根据用户特定要求和设置创建新的从站文件。从站文件列表&#xff1a;C源代码文件源代码文档&#xff08;可选&#xff09;设备描述&#xff08;ESI&#xff09;&#xff08;可选&#xff09;支持的操作系统&#xff1a;Windows XP, Vista, 7 (32位…

太流批了,老牌软件,数据对比神器

在日常工作中打工人有的时候需要整理表格和数据&#xff0c;需要在两个文档之间进行对比&#xff0c;看一看文件做了哪些修改。但是&#xff0c;如果用眼进行一行行对比的话就会很麻烦&#xff0c;而且效率会很慢。今天给大家推荐一款好用的数据对比软件&#xff0c;有需要的小…

收藏!裸辞转型AI大模型,我的完整攻略与经验分享

本文分享裸辞转型AI大模型的成功经历&#xff0c;包括转行动机、系统学习准备和面试经验。强调深入理解底层原理、做好经济心态准备、针对性优化简历和保持良好心态的重要性&#xff0c;为想进入AI领域的人提供实用参考。今年很重要的一个经历就是裸辞然后顺利转行到了AI大模型…

个性化旅游行程规划系统-计算机毕业设计源码+LW文档

摘要 随着人们生活水平的提高和旅游需求的日益增长&#xff0c;旅游已成为人们放松身心、拓展视野的重要方式。然而&#xff0c;在旅游过程中&#xff0c;行程规划、费用管理、信息分享等方面的问题也逐渐凸显。传统的旅游管理方式存在效率低下、信息不及时等问题&#xff0c;难…

北大团队创新方案:CKDA框架解决跨模态行人重识别的持续学习痛点

北大团队提出CKDA框架&#xff0c;解决跨模态行人重识别中的持续学习灾难性遗忘问题。该框架通过跨模态通用提示生成器提取共享特征&#xff0c;单模态专用提示生成器保留模态特有信息&#xff0c;以及跨模态知识对齐引擎防止遗忘。实验表明&#xff0c;该框架在四个主流数据集…

2026年--Lc333-328. 奇偶链表(链表)--java版

1.题目2.思路 原地重排链表&#xff1a; odd.nexteven.next&#xff1a;跳过偶数&#xff0c;把下一个奇数连起来 even.nextodd.next&#xff1a;跳过奇数&#xff0c;把下一个偶数连起来 最后把奇数链尾接回 evenHead 3.代码实现 /*** Definition for singly-linked list.* pu…

AI会取代前端吗?2026年前端发展路线图,建议收藏学习

AI无法完全取代前端开发&#xff0c;因缺乏人类的逻辑、沟通和创新能力。前端工作不仅是写代码&#xff0c;还包括与多团队协作。当前前端行业竞争激烈&#xff0c;要求不断提高&#xff0c;但仍有发展空间。前端工程师可考虑向管理、架构师或讲师方向发展&#xff0c;或继续深…

牛批了,桌牌台签神器,批量制作

在日常开会的时候&#xff0c;往往需要制作桌牌台签&#xff0c;排版和格式校对等问题也是非常头疼的。今天给大家推荐一款桌牌台签打印神器&#xff0c;能够快速高效的制作各种类型的桌牌&#xff0c;非常方便&#xff0c;有需要的小伙伴可以下载收藏。 桌牌台签打印 一键制作…