148.栈与队列:前K个高频元素(力扣)

代码解决

class Solution {
public:
    // 自定义比较类,用于优先队列(小顶堆)
    class mycomparison
    {
    public:
        // 重载操作符,用于比较两个pair,基于pair的第二个值(频率)
        bool operator()(const pair<int,int>& lhs, const pair<int,int>& rhs)
        {
            return lhs.second > rhs.second; // 小顶堆:频率小的排在前面
        }
    };

    vector<int> topKFrequent(vector<int>& nums, int k) 
    {
        // 用于存储每个数字及其出现的频率
        unordered_map<int,int> map;
        for(int i = 0; i < nums.size(); i++)
        {
            map[nums[i]]++;
        }

        // 优先队列(小顶堆),用于维护频率最高的前k个元素
        priority_queue<pair<int,int>, vector<pair<int,int>>, mycomparison> pri_map;

        // 遍历频率表,将元素及其频率插入优先队列
        for(auto it = map.begin(); it != map.end(); it++)
        {
            pri_map.push(*it);
            // 如果优先队列的大小超过k,则弹出频率最小的元素
            if(pri_map.size() > k)
            {
                pri_map.pop();
            }
        }

        // 初始化结果向量,大小为k
        vector<int> result(k);
        // 从优先队列中提取前k个频率最高的元素
        for(int i = k - 1; i >= 0; i--)
        {
            result[i] = pri_map.top().first;
            pri_map.pop();
        }
        return result;
    }
};

详细解释

  1. 自定义比较类

    • mycomparison类重载了operator(),用来比较两个pair<int, int>对象。比较基于pair的第二个值(即频率)。这样可以使优先队列按频率从小到大排序(小顶堆)。
  2. 频率统计

    • 使用unordered_map<int, int>来统计nums数组中每个数字出现的频率。键为数字,值为该数字出现的次数。
  3. 优先队列

    • 定义优先队列pri_map,存储pair<int, int>类型的数据,使用mycomparison类进行比较,从而构建一个小顶堆。
    • 遍历频率表,将每个数字及其频率插入优先队列。如果优先队列的大小超过k,就会移除频率最小的元素。这保证了优先队列中始终保存着频率最高的前k个元素。
  4. 构建结果向量

    • 初始化一个大小为k的结果向量result
    • 从优先队列中提取前k个频率最高的元素,并按照从高到低的顺序存入结果向量中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网页图片加载慢的求解指南

网页/图片加载慢的求解指南 一、前言与问题描述 今天刚换上华为的HUAWEI AX3 Pro New&#xff0c;连上WIFI后测速虽然比平时慢&#xff0c;但是也不算太离谱&#xff0c;如下图所示&#xff1a; 估计读者们有也和作者一样&#xff0c;还没意识到事情的严重性&#x1f601;。 …

UE_地编教程_创建地形洞材质

个人学习笔记&#xff0c;不喜勿喷。侵权立删&#xff01; 使用地形洞材质来遮罩地形上特定位置的可视性和碰撞。如要在山脉侧面创建进入洞穴的入口&#xff0c;此操作将非常有用。可使用地形材质和地形洞材质的相同材质&#xff0c;但注意&#xff1a;对比不使用不透明蒙版的…

基于Cloudflare/CloudDNS/GitHub使用免费域名部署NewBing的AI服务

部署前准备&#xff1a; Cloudflare 账号 https://dash.cloudflare.com/login CloudDNS 账号 https://www.cloudns.net/ GitHub 账号 https://github.com/Harry-zklcdc/go-proxy-bingai Cloudflare 部署 Worker CloudDNS 获取免费二级域名 GitHub New Bing Ai 项目 https://git…

Linux系统硬盘分区

文章目录 一、硬盘和分区1.1 硬盘的概念1.2 硬盘分区的类别1.3 硬盘分区的方式1.3.1 MBR分区1.3.2 GPT分区 1.4 硬盘分区的意义1.4.1 分区的作用1.4.2 分区的缺点 二、如何建立分区2.1 分区命令2.1.1 fdisk命令2.1.2 gdisk命令 2.2 建立分区2.2.1 建立MBR分区建立主分区建立扩展…

电脑如何在网页上下载视频 浏览器如何下载网页视频

对于现代职场人士而言&#xff0c;在日常生活中难免需要下载各种短视频&#xff0c;IDM下载加速器可以轻松获取抖音、快手等平台的无水印短视频文件。 Internet Download Manager&#xff0c;简称IDM。功能强大的网络下载器。您不需要多余的操作&#xff0c;IDM 能捕获您的下载…

实战

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 实战一&#xff1a;模拟支付宝蚂蚁森林的能量产生过程 支付宝的蚂蚁森林通过日常的走步、生活缴费、线下支付、网络购票、共享单车等低碳、环保行为…

行为设计模式之策略模式

文章目录 概述原理结构图 代码实现小结 概述 策略模式(strategy pattern)的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。 在软件开发中也会遇到相似的情况&…

【Lexus.4】Executive Sedan——Dismantling Follow-up

文章目录 【碰撞测试】前后防撞钢梁偏置碰撞A/B/C柱&#xff0c;边梁抗拉、屈服强度 【底盘】平整度护板&#xff08;发动机&#xff0c;底盘&#xff09;前副车架结构前悬架形式后悬架形式与材质簧下质量 【发动机】【轮上马力】【零部件供应商】 来自2021《懂车大爆炸》——是…

操作系统课程实验1-进程调度模拟实验

操作系统课程实验1-进程调度模拟实验 一、实验介绍 1.1 实验目的 本实验模拟在单处理机环境下的处理机调度&#xff0c;帮助理解进程调度的概念&#xff0c;深入了解进程控制块的功能&#xff0c;以及进程的创建、撤销和进程各个状态间的转换过程。 1.2 实验内容 进程调度算…

md是什么?如何打开md类型的文件?假如使用Typora打开,如何免费激活Typora?

md是什么&#xff1f;如何打开md类型的文件 前言一、md是什么简介常见打开md类型文件的方法使用文本编辑器使用专用Markdown编辑器使用在线Markdown编辑器在浏览器中安装插件打开 二、下载安装Typora三、免费激活Typora激活Typora关闭软件每次启动时的已激活弹窗去除软件左下角…

动手学深度学习4.6 暂退法-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;丢弃法_哔哩哔哩_bilibili 本节教材地址&#xff1a;4.6. 暂退法&#xff08;Dropout&#xff09;…

NDIS驱动程序堆栈

NDIS 6.0 引入了暂停和重启驱动程序堆栈的功能。 若要支持 NDIS 6.0 提供的堆栈管理功能&#xff0c;必须重写旧版驱动程序。 NDIS 6.0 还引入了 NDIS Filter驱动程序。 Filter驱动程序可以监视和修改协议驱动程序与微型端口驱动程序之间的交互。 与 NDIS 5 相比&#xff0c;F…

188M2传奇BLUEM2引擎源码开源版附带编译教程2024最新开源

2024最新开源188M2传奇BLUEM2引擎源码开源2版最初开源版本附带编译教程 源码下载地址&#xff1a;极速云 如果需要优惠可以选择第一版最初开源188M2传奇BLUEM2引擎源码开源1版最初开源版本附带编译教程2024最新开源

vue2的方法与监听

vue2的方法 不可以使用箭头函数 <template> <div><div>{{sum2()}}</div><button click"add">add</button> </div></template><script> export default {data(){return{name:"张三",num:20,num2:3…

AI分析SP和pk进行sk分析

SP原始表行标题代表题目序号&#xff0c;列代表学生&#xff0c;如果学生答对题目为1&#xff0c;否则为0。问题知识点矩阵这个文件横轴代表每个知识点&#xff0c;列标题代表每个题目序号&#xff0c;如果题目包含这个知识点则该处值为1。通过两个文件判断学生对于每个知识点的…

达梦数据库创建根据日期按月自动分区表

达梦数据库创建根据日期自动分区表 概念 达梦数据交换平台(简称DMETL)是在总结了众多大数据项目经验和需求并结合最新大数据发展趋势和技术的基础上&#xff0c;自主研发的通用的大数据处理与集成平台。 DMETL创新地将传统的ETL工具&#xff08;Extract、Transform、Loading…

计算机网络6——应用层6

文章目录 一、应用进程跨越网络的通信1、系统调用和应用编程接口2、几种常用的系统调用1&#xff09;连接建立阶段2&#xff09;数据传送阶段3&#xff09;连接释放阶段 二、P2P 应用1、具有集中目录服务器的P2P工作方式2、具有全分布式结构的P2P文件共享程序3、P2P 文件分发的…

Android 通过布局生成图片

通过布局生成图片 首先效果图 在竖屏的情况下通过&#xff0c;一般情况下&#xff0c;只要布局在页面上可见&#xff0c;并显示全&#xff0c;通过布局生成图片&#xff0c;都可以&#xff0c;但是横屏就不行了&#xff0c;会出现图片显示不完全的情况。 val bitmap Bitmap.c…

APM2.8用USB在线下载固件

1.把APM飞控用安卓手机的USB线插入电脑。 选择COM口&#xff0c;不要选择auto&#xff0c;如果你没有COM口说明你驱动安装有问题。 波特率115200。点击相应的图标就可以下载固件到飞控板。 请注意&#xff1a;烧录APM必须选择INSTALL FIRMWARE LEAGACY,第一个是用于刷pixhawk的…

sqpserver——利用scott库练习内连接(一)

一.查找每个员工的姓名&#xff0c;部门编号&#xff0c;薪水和薪水等级 select emp.ename, emp.deptno, emp.sal, SALGRADE.GRADE from emp join SALGRADE on emp.sal>LOSAL and emp.sal<HISAL; 二.查找每个部门的编号&#xf…