【懒删除堆】力扣3092. 最高频率的 ID

devtools/2025/2/3 16:40:30/

你需要在一个集合里动态记录 ID 的出现频率。给你两个长度都为 n 的整数数组 nums 和 freq ,nums 中每一个元素表示一个 ID ,对应的 freq 中的元素表示这个 ID 在集合中此次操作后需要增加或者减少的数目。

增加 ID 的数目:如果 freq[i] 是正数,那么 freq[i] 个 ID 为 nums[i] 的元素在第 i 步操作后会添加到集合中。
减少 ID 的数目:如果 freq[i] 是负数,那么 -freq[i] 个 ID 为 nums[i] 的元素在第 i 步操作后会从集合中删除。
请你返回一个长度为 n 的数组 ans ,其中 ans[i] 表示第 i 步操作后出现频率最高的 ID 数目 ,如果在某次操作后集合为空,那么 ans[i] 为 0 。

示例 1:
输入:nums = [2,3,2,1], freq = [3,2,-3,1]

输出:[3,3,2,2]

解释:
第 0 步操作后,有 3 个 ID 为 2 的元素,所以 ans[0] = 3 。
第 1 步操作后,有 3 个 ID 为 2 的元素和 2 个 ID 为 3 的元素,所以 ans[1] = 3 。
第 2 步操作后,有 2 个 ID 为 3 的元素,所以 ans[2] = 2 。
第 3 步操作后,有 2 个 ID 为 3 的元素和 1 个 ID 为 1 的元素,所以 ans[3] = 2 。

示例 2:
输入:nums = [5,5,3], freq = [2,-2,1]

输出:[2,0,1]

解释:

第 0 步操作后,有 2 个 ID 为 5 的元素,所以 ans[0] = 2 。
第 1 步操作后,集合中没有任何元素,所以 ans[1] = 0 。
第 2 步操作后,有 1 个 ID 为 3 的元素,所以 ans[2] = 1 。

在这里插入图片描述

懒删除堆

class Solution {
public:vector<long long> mostFrequentIDs(vector<int>& nums, vector<int>& freq) { int n = nums.size();vector<long long> ans(n);unordered_map<int, long long> cnt;priority_queue<pair<long long, int>> pq;for(int i = 0; i < freq.size(); i++){int x = nums[i];cnt[x] += freq[i];pq.emplace(cnt[x], x);while(pq.top().first != cnt[pq.top().second]){pq.pop();}ans[i] = pq.top().first;}return ans;}
};

这道题我们要明白,哈希表可以方便用来储存当前状况每个id的频率是多少,但由于哈希表是无序的,不方便比较,所以我们用一个最大堆pq来储存频率进行比较。但是由于我们的频率一直在变化,我们为了减少对堆的操作,我们只要检验我们当前回合的id的最大频率,和哈希表中的正确频率是否一样,如果不一样的话,就将它从堆中弹出删除,直到检验成功为止,堆顶的元素才是答案。


http://www.ppmy.cn/devtools/155767.html

相关文章

计算机网络 笔记 网络层 3

IPv6 IPv6 是互联网协议第 6 版&#xff08;Internet Protocol Version 6&#xff09;的缩写&#xff0c;它是下一代互联网协议&#xff0c;旨在解决 IPv4 面临的一些问题&#xff0c;以下是关于 IPv6 的详细介绍&#xff1a; 产生背景&#xff1a; 随着互联网的迅速发展&…

shallowRef和shallowReactive的用法以及使用场景和ref和reactive的区别

Vue3 浅层响应式 API 1. ref vs shallowRef 1.1 基本概念 ref: 深层响应式&#xff0c;会递归地将对象的所有属性转换为响应式shallowRef: 浅层响应式&#xff0c;只有 .value 的改变会触发更新&#xff0c;不会递归转换对象的属性 1.2 使用对比 // ref 示例 const deepRe…

数据结构与算法之栈: LeetCode 641. 设计循环双端队列 (Ts版)

设计循环双端队列 https://leetcode.cn/problems/design-circular-deque/description/ 描述 设计实现双端队列。 实现 MyCircularDeque 类: MyCircularDeque(int k) &#xff1a;构造函数,双端队列最大为 k 。boolean insertFront()&#xff1a;将一个元素添加到双端队列头部…

【开源免费】基于SpringBoot+Vue.JS贸易行业crm系统(JAVA毕业设计)

本文项目编号 T 153 &#xff0c;文末自助获取源码 \color{red}{T153&#xff0c;文末自助获取源码} T153&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

基于微信的课堂助手小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

毕业设计--具有车流量检测功能的智能交通灯设计

摘要&#xff1a; 随着21世纪机动车保有量的持续增加&#xff0c;城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题&#xff0c;本文设计了一款智能交通灯系统&#xff0c;利用车流量检测功能和先进的算法实现了…

ubuntu22.04防火墙策略

Ubuntu 22.04 作为一款流行的Linux发行版&#xff0c;其安全性尤为重要。防火墙是保护系统免受外部威胁的关键组成部分。本文将介绍如何在Ubuntu 22.04上配置和管理防火墙策略&#xff0c;包括使用UFW&#xff08;Uncomplicated Firewall&#xff09;和更为复杂的iptables。 一…

Redis篇 Redis如何清理过期的key以及对应的解决方法

Redis设置Key过期时间 在 Redis 中&#xff0c;可以通过特定的命令为 Key 设置过期时间&#xff0c;使得 Key 在一定时间后自动删除&#xff0c;这对于管理缓存、验证码等临时数据非常有用。 解决方法 1. Redis过期删除策略 1.1 如何实现过期策略 对一个 key 设置了过期时间…