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

LeetCode 3885.设计事件管理器

给你一组初始事件列表,其中每个事件有一个唯一的 eventId 和一个 priority(优先级)。

实现 EventManager 类:

EventManager(int[][] events) 使用给定事件初始化管理器,其中 events[i] = [eventIdi, priorityi]。
void updatePriority(int eventId, int newPriority) 更新具有 id 为 eventId 的 活跃 事件的优先级为 newPriority。
int pollHighest() 移除并返回具有 最高优先级 的 活跃事件 的 eventId。如果有多个活动事件具有相同的优先级,则返回 eventId 最小的事件。如果没有活跃事件,则返回 -1。
如果一个事件没有被 pollHighest() 移除,则称其为 活跃事件。

示例 1:

输入:
[“EventManager”, “pollHighest”, “updatePriority”, “pollHighest”, “pollHighest”]
[[[[5, 7], [2, 7], [9, 4]]], [], [9, 7], [], []]

输出:
[null, 2, null, 5, 9]

解释

EventManager eventManager = new EventManager([[5,7], [2,7], [9,4]]); // 使用三个事件初始化管理器
eventManager.pollHighest(); // 两个事件 5 和 2 的优先级均为 7,因此返回 id 最小的事件 2
eventManager.updatePriority(9, 7); // 将事件 9 的优先级更新为 7
eventManager.pollHighest(); // 剩下的优先级最高的事件是 5 和 9,返回 5
eventManager.pollHighest(); // 返回 9
示例 2:

输入:
[“EventManager”, “pollHighest”, “pollHighest”, “pollHighest”]
[[[[4, 1], [7, 2]]], [], [], []]

输出:
[null, 7, 4, -1]

解释

EventManager eventManager = new EventManager([[4,1], [7,2]]); // 使用两个事件初始化管理器
eventManager.pollHighest(); // 返回 7
eventManager.pollHighest(); // 返回 4
eventManager.pollHighest(); // 没有剩余事件,返回 -1

提示:

1 <= events.length <= 105^55
events[i] = [eventId, priority]
1 <= eventId <= 109^99
1 <= priority <= 109^99
events 中的所有 eventId 值都是 唯一的 。
1 <= newPriority <= 109^99
对每次调用 updatePriority,eventId 都指向一个 活跃事件。
对 updatePriority 和 pollHighest 的总调用次数最多为 105^55次。

懒删除堆,我们可以维护一个优先级和事件id的最大堆,以及一个事件Id到优先级的哈希表。每次updatePriority时,先修改哈希表,然后不删除堆中当前事件id的优先级,而是插入一个新的正确节点进堆;每次pollHighest时,检查当前堆顶事件id的优先级是否是哈希表中存放的优先级,如果是,就找到了优先级最高的事件,否则堆顶就是失效的事件:

classEventManager{public:EventManager(vector<vector<int>>&events){for(vector<int>&event:events){eventToPriority[event[0]]=event[1];heap.push_back({event[1],-event[0]});}make_heap(heap.begin(),heap.end());}voidupdatePriority(inteventId,intnewPriority){eventToPriority[eventId]=newPriority;heap.push_back({newPriority,-eventId});push_heap(heap.begin(),heap.end());}intpollHighest(){while(!heap.empty()&&(eventToPriority.find(-heap[0][1])==eventToPriority.end()||heap[0][0]!=eventToPriority[-heap[0][1]])){pop_heap(heap.begin(),heap.end());heap.pop_back();}if(heap.empty()){return-1;}intans=-heap[0][1];pop_heap(heap.begin(),heap.end());heap.pop_back();eventToPriority.erase(ans);returnans;}private:unordered_map<int,int>eventToPriority;vector<vector<int>>heap;};/** * Your EventManager object will be instantiated and called as such: * EventManager* obj = new EventManager(events); * obj->updatePriority(eventId,newPriority); * int param_2 = obj->pollHighest(); */

时间复杂度:
初始化:O(n),其中 n 是 events 的长度。
updatePriority:O(log(n+q)),其中 q 是 updatePriority 的调用次数。
pollHighest:均摊 O(log(n+q))。每个元素至多入堆出堆各一次。
空间复杂度:O(n+q)。

http://www.jsqmd.com/news/1402208/

相关文章:

  • 2026 年西宁靠谱的全铝油浸式变压器源头厂家哪个好,有人靠它省百万成本,背后的秘密藏在这台大家伙里?-华屹变压器 - 行业推荐官【认证】
  • must_fail 没写死——拒答一次标 PASS?这不是评测,是表演 · Agent 死刑题
  • [光学原理与应用-504]:T‑MINI PLUS激光雷达测距,如何避免被相连的雷达测距发出的激光干扰
  • 从像素到数据:财报OCR如何重构财务报表识别与稽核流水线
  • 从零构建内容:以无线Mesh组网为例,拆解技术创作的结构化思维
  • 2026杭州空调维修怎么选?简单到家服务细节大公开 (第1次重投) - 简单到家
  • 快速上手vibe-coding!!!
  • Qwen与远程MCP混用第3天:密钥险入日志,我的4层隔离军规
  • FlowPilot:基于双流Transformer世界模型的无人机高速自主导航系统
  • 大模型技术生态与AutoClass实战指南
  • Python数据分析工程师核心技能与实战指南
  • 穿云透雾全天候|单视频三维实时重构:筑牢陆海国门平战态势底座技术白皮书
  • 2026 年至今,徐州可靠的AI获客平台有哪些,靠它半年获客破千,传统销售看到都慌了神 - 企业信息推荐-2
  • 基于.NET AgentFramework构建智能体框架:原理、设计与实战
  • 个人博客用DV就够了?90%的人忽略了这个关键因素
  • 商业模式画布实战指南:9张分析图与6套模板快速应用
  • 2026年职场成长工具指南5个核心使用场景及实用选择标准
  • 诚信的佛山一站式高服务高品质办公平台
  • LangChain 2026实战:构建可靠Agent与RAG管道
  • 电赛图传开源项目:快速搭建嵌入式图像传输系统
  • 《从零开发DevOps 平台——FastAPI + Vue3》——可当毕业设计
  • 抖音对标 AI 评论回复工具 — 全自动截流引流,评论区精准获客利器
  • 性别、地区、季节……这些“分类变量”怎么做回归?一篇文章讲透虚拟变量
  • 从Arduino到OpenMV:全栈机器人开发实战指南
  • STM32便携图传实战:从硬件选型到软件调试的完整指南
  • VLAN的基本配置
  • 选对AI论文软件少熬 3 个大夜!高口碑工具盘点 + 避坑全攻略
  • 深圳平板整机组装厂家怎么选?专业ODM源头工厂对接指南 - 装修教育财税推荐2026
  • 群晖NAS搭建Jellyfin影音库:基于tinyMediaManager的本地NFO元数据自动化管理
  • XPBD物理模拟:从约束柔度到布料模拟的算法实现与优化