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

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

你需要在一个集合里动态记录 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.kler.cn/a/527885.html

相关文章:

  • 动态规划每日一练(四)
  • Google 和 Meta 携手 FHE 应对隐私挑战
  • 适合超多氛围灯节点应用的新选择
  • 基于排队理论的物联网发布/订阅通信系统建模与优化
  • Jason配置环境变量
  • YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)
  • doris:高并发导入优化(Group Commit)
  • Oracle Primavera P6自动进行进度计算
  • 【算法设计与分析】实验3:动态规划—最长公共子序列
  • 电路研究9.2.6——合宙Air780EP中HTTP——HTTP GET 相关命令使用方法研究
  • 如何在C语言项目中优雅地使用结构体
  • VirtualBox:跨磁盘导入已存的vdi磁盘文件顺便测试冷迁移
  • MySQL 导入数据
  • DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”
  • Win11 Windows 禁用右键折叠菜单
  • 大数据挖掘--两个角度理解相似度计算理论
  • 文献阅读 250131-Global Carbon Budget 2023(1)
  • 如何成为一名 Python 全栈工程师攻略
  • 加一(66)
  • CSS 中调整元素大小的全面指南
  • 人工智能|基本概念|人工智能相关重要概念---AI定义以及模型相关知识
  • 【Nacos】配置中心
  • Rust 条件语句
  • 仿真设计|基于51单片机的景区人数管理系统仿真
  • android安卓用Rime
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.29 内存奥秘:跨语言内存管理实战