87、【栈与队列】leetcode ——347. 前 K 个高频元素:优先队列(小根堆)+Hash表(C++版本)

news2024/11/29 18:36:53

题目描述

在这里插入图片描述
在这里插入图片描述
原题链接:347. 前 K 个高频元素

一、优先队列(小根堆)+Hash表

使用Hash表存nums中各元素出现次数,维护一个优先级队列,在里面存k个数,采用小根堆方式,从小到大进行排列。当存入的数多余k个时,将队头(最小值)弹出。

C++优先队列(priority_queue)用法详解、【C++】小白友好【优先队列的基础知识】

STL 中,priority_queue 容器适配器的定义如下:

template <typename T,
        typename Container=std::vector<T>,
        typename Compare=std::less<T> >
class priority_queue{
    //......
}

在这里插入图片描述

默认的构建方式为大根堆less<>

使用自定义的数据类型的时候,可以重写比较函数,也可以进行运算符重载(less重载小于“<”运算符,构造大根堆greater重载大于“>”运算符,构造小根堆)。

class Solution {
public:
    class mycomparison {
    public:
        // 小根堆的方式。注:< 为大根堆        
        // rhs初始时,指向新加入元素。
        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) {
        // key为nums中的数,value为nums的出现次数
        unordered_map<int, int> record;
        for(int num : nums) {
            record[num]++;            
        }
        // 建立小根堆排列方式的优先队列
        priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;
        for(unordered_map<int, int>::iterator it = record.begin(); it != record.end(); it++) {
            pri_que.push(*it);
            // 插入元素个数k时,弹出当前的最小值
            if(pri_que.size() > k) {
                pri_que.pop();
            }
        }
        vector<int> res(k);
        for(int i = k - 1; i >= 0; i--) {
            res[i] = pri_que.top().first;
            pri_que.pop();
        }
        return res;
    }
};

时间复杂度 O ( n l o g k ) O(n logk) O(nlogk)(堆中至多k个,每次调整堆需要 O ( l o g k ) O(logk) O(logk)
空间复杂度 O ( n ) O(n) O(n)

参考文章:
347.前 K 个高频元素、前 K 个高频元素

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

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

相关文章

Vue3——第五章(响应式 API:isRef、unref、toRef、toRefs等工具函数)

一、isRef() 检查某个值是否为 ref。请注意&#xff0c;返回值是一个类型判定 (type predicate)&#xff0c;这意味着 isRef 可以被用作类型守卫 二、unref() 如果参数是 ref&#xff0c;则返回内部值&#xff0c;否则返回参数本身。这是 val isRef(val) ? val.value : v…

【CPP】STL简介

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;什么是 S…

李宏毅ML-机器学习基本概念简介

机器学习基本概念简介 Machine Learning 约等于 Looking for a function. Different types of functions: Regression: The function outputs a scalar. Classification: Given options(classes), the function outputs the correct one. How to find a function? > 预测本…

为什么学完了 C 语言觉得自己什么都干不了?

其他方向不了解哈&#xff0c;我2013年大一开始自学C语言&#xff0c;然后就开始做嵌入式&#xff0c;大学四年&#xff0c;到现在毕业又六年&#xff0c;C语言已经陪我十年了&#xff0c;可以说是一直坚持且养家糊口的工具。 所以&#xff0c;别的也许不行&#xff0c;但是嵌…

使用.htaccess设置图片防盗链的详细方法

对于虚拟主机用户来说&#xff0c;最方便的莫过于利用.htaccess设置图片防盗链了。上网搜了一下&#xff0c;.htaccess规则写法很多&#xff0c;但是大部分的区别在于最后一行&#xff0c;下面我们先看看正确的.htaccess防盗链写法&#xff0c;稍后我再详细解释一下最后一行的重…

JAVA实现代码热更新

JAVA实现代码热更新引言类加载器实现热更新思路多种多样的加载来源SPI服务发现机制完整代码引言 本文将带领大家利用Java的类加载器加SPI服务发现机制实现一个简易的代码热更新工具。 类加载相关知识可以参考: 深入理解JVM虚拟机第三版, 深入理解JVM虚拟机(第二版)—国外的,自…

从零开始搭建一个vue demo工程

查询了不少文章&#xff0c;有知乎、CSDN、简书、思否等&#xff0c;发现如下操作性比较好&#xff0c;特此记录 目录 使用vue-cli创建 使用vite创建 Vue2和Vue3的代表作 参考文章 使用vue-cli创建 Vue3-使用vue/cli搭建项目 - 个人文章 - SegmentFault 思否 此处使用了v…

一文看懂基站无源交调

众所周知&#xff0c;有源器件会在系统中产生非线性效应。虽然已开发出多种技术来改善此类器件在设计和运行阶段的性能&#xff0c;但容易忽视的是&#xff0c;无源器件也可能引入非线性效应&#xff1b;虽然有时相对较小&#xff0c;但若不加以校正&#xff0c;这些非线性效应…

将vue项目打包成电脑端应用.exe

目录 第一步:下载模板electron-quick-start 第二步&#xff1a;进入到下载好的模板文件当中&#xff08;electron-quick-start&#xff09; 第三步&#xff1a;打包自己的项目&#xff08;npm run build&#xff09; 第四步&#xff1a;删掉官方demo下的index.html文件 …

Framework入门

一入门简介Android系统建构分为四层由上到下依次是应用层&#xff0c;应用框架层&#xff0c;依赖库层&#xff0c;内核层&#xff0c;framework处于第二层&#xff0c;它为应用层的开发者提供基本功能&#xff0c;帮助开发快速构建应用程序。FrameWork框架采用c/s架构&#xf…

Java之反射爆破操作

一些方法 首先说一下-getField/Method什么的这种不带Declared只能获取到对应public的属性/方法 只有带Declared可以获取到非public的属性/方法 再看不带s和带s区别 不带s只获取对应的构造器/方法 比如说构造器 getDeclaredConstructor(int.class,String class) 就会获取不管什么…

【数据分析】【Pandas】(一)如何制作频率分布直方图

文章目录概述1. 直方图2. 密度图概述 计算一组数据的分布有助于我们更好的了解数据构成&#xff0c;我们可以通过直方图或密度图&#xff0c;将离散的数据通过连续的方式展现出来。 数据分布&#xff08;频数分布&#xff09;&#xff1a;在各组按顺序排列的基础上&#xff0c…

小伍说,商业发展均是顺势而为,【字节跳动】之所以成功是因为顺应趋势,成功是必然结果!

昨天看完2021年 刘润【进化的力量】年终演讲&#xff0c;让我深刻感受到两点&#xff1a; 1、所有商业的变化&#xff0c;都是顺势而为&#xff01; 2、所有理所当然的现在&#xff0c;都是曾经不可思议的未来&#xff0c;所有现在不可思议的未来&#xff0c;可能都是明天理所…

JavaSE笔记——函数式编程(高级集合类和收集器)

文章目录前言一、方法引用二、元素顺序三、使用收集器1.转换成其他集合2.转换成值3.数据分块4.数据分组5.字符串6.组合收集器总结前言 前面介绍了集合类的部分变化&#xff0c;事实上&#xff0c;Java 8 对集合类的改进不止这些。现在是时候介绍一些高级主题了&#xff0c;包括…

LInkedList的模拟实现

在之前的文章笔者介绍了链表的实现&#xff1a;无头单向非循环链表的实现&#xff01;感兴趣的各位老铁可以点进来看看&#xff1a;https://blog.csdn.net/weixin_64308540/article/details/128397961?spm1001.2014.3001.5502对于此篇博客&#xff0c;在一写出来&#xff0c;便…

java学习day72(乐友商城)微信支付实现

今日目标&#xff1a; 会调用订单系统接口 实现订单结算功能 实现微信支付功能 1.订单系统接口 我们不做开发&#xff0c;只讲解 1.1.导入订单服务 把课前资料提供的leyou-order复制到D:\heima\code\leyou目录。 然后在工程内导入&#xff1a; 然后导入module&#xff1a…

java:责任链设计模式配合Spring@Order注解使用场景

java&#xff1a;责任链设计模式配合SpringOrder注解使用场景 1 前言 java的责任链模式&#xff0c;经典使用的场景为SpringMVC的doDispatch下&#xff0c;针对请求的过滤链式行为。实际开发场景中&#xff0c;可配合Spring的Order注解&#xff0c;定义1个有顺序的链式Compon…

我在深圳的三次工厂旅程 (一)

2019年末加入一家人工智能AI创业公司&#xff0c;由于公司涉及到智能硬件产品&#xff0c;所以有机会参与到硬件产品的整个研发测试端、产品迭代流、工厂生产序等方面的这些事情。相对于研发测试、产品迭代这些在过往的工作中经历中相对比较熟悉和接触频繁&#xff0c;在软件产…

鉴定完毕!来看看跨年晚会谁假唱了…欧莱雅智能画眉设备;首个AI律师下月出庭;推特又裁员;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f3a1; 『谁在假唱』技术手段分析跨年演唱会上的歌手们 各大卫视的跨年演唱会&#xff0c;你追了几场&#xff1f;看出来了谁在对口型&#xff1f;B站Up主…

【北京理工大学-Python 数据分析-2.2Matplotlib绘制饼图、直方图、极坐标、散点图】

pyplot的基础图标函数 函数说明plt.plot(x,y,fmt,…)绘制一个坐标图plt.boxplot(data,notch,position)绘制一个箱型图plt.bar(left,height,width,bottom)绘制一个条形图plt.barh(width,bottom,left,height)绘制一个横向条形图plt.polar(theta,r)绘制极坐标图plt.psd(x,NFFT256…