《priority_queue》

news2024/10/5 17:21:34

本文主要介绍优先级队列的使用,以及一个TOPK问题的OJ

文章目录

  • 一、priority_queue的介绍
  • 二、priority_queue的使用
  • 三、[数组中第k个大的元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/)



一、priority_queue的介绍

  1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
  2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。
  3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
  4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:
  • empty():检测容器是否为空
  • size():返回容器中有效元素个数
  • front():返回容器中第一个元素的引用
  • push_back():在容器尾部插入元素
  • pop_back():删除容器尾部元素
  1. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。
  2. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作。
  3. 仿函数/函数对象
    在这里插入图片描述

二、priority_queue的使用

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。

注意:默认情况下priority_queue是大堆。

#include<iostream>
#include<queue>
#include<functional>//greater算法头文件
using namespace std;
void test_priority_queue()
{
	// 默认是大堆——默认给的仿函数是less
	//priority_queue<int> pq;

	// 控制小的优先级高——给仿函数greater
	// 传入第三个模板参数,必须要显式传入第二个
	priority_queue<int,vector<int>,greater<int>> pq;
	pq.push(1);
	pq.push(2);
	pq.push(3);
	pq.push(4);
	pq.push(5);

	while (!pq.empty())
	{
		cout << pq.top() << " ";
		pq.pop();
	}
}
int main()
{
	test_priority_queue();
	return 0;
}

三、数组中第k个大的元素

在这里插入图片描述
方法1;排序后直接返回,O(NlogN)

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        //排序,然后直接返回倒数第K元素
        sort(nums.begin(),nums.end());
        return nums[nums.size()-k];
    }
};

方法2:遍历数组,建立大小为n的大堆,然后依次删除堆顶元素,删除k-1次,最后的堆顶的元素就是第K个大的元素。时间复杂度O(n+klogn)。因为删除元素,需要先调换堆顶和堆尾,然后向下调整(lonN)

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        priority_queue<int> pq(nums.begin(),nums.end());//建立大堆O(n)

        //O(klogn)
        while(--k)
        {
            pq.pop();
        }
        return pq.top();
    }
};

方法3:tok问题,方法2,当n>>k的时候,方法2其实还是nlonn,但是本方法是nlogk
建立K个元素的小堆,比堆顶大就删除,入堆

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        priority_queue<int,vector<int>,greater<int>> pq(nums.begin(),nums.begin()+k);//建立k个元素的大堆O(k)

        //从k位置开始遍历原数组,如果元素比堆顶元素大,那么就删除堆顶,然后入堆。
        //因为堆没有[],不能直接替换
        //O((n-k)logk)
        for(size_t i = k;i < nums.size();++i)
        {
            if(nums[i] > pq.top())
            {
                pq.pop();
                pq.push(nums[i]);//插入后会自动建堆的
            }
        }
        return pq.top();
    }
};

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

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

相关文章

代码创造童话--Python为六一儿童节送专属礼物

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 六一儿童节到啦&#xff0c;祝所有的朋友们六一儿童节快乐&#xff01; 在这个节日里&#xff0c;孩子们可以接受父母、老师、社会各界人士的关爱和祝福&#xff0c;同时也可以享受到各种各样的礼物和活动。Python作为一门…

第十五篇、基于Arduino uno,获取mpu6050三轴加速度、角速度、温度的数据——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;第一个值是温度值&#xff0c;第二个值是X轴的加速度&#xff0c;第三个值是Y轴的加速度&#xff0c;第四个值是Z轴的加速度&#xff0c;第五个值是X轴的角速度&#xff0c;第六个值是Y轴的角速度&#xff…

C++库函数——string类

1. 简介 ①什么是string类 源文档 译&#xff1a; 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持&#xff0c;其接口类似于标准字符容器的接口&#xff0c;但添加了专门用于操作单字节字符字符串的设计特性。 3. string 类是使用 char( 即作为它…

【六一】90后的你们还记得年少时的梦吗?还记得你们当初追的奥特曼吗?现在就让我们一起回味我们逝去的曾经吧!

迎面走来的是我们从未正式出过剧集&#xff0c;并附有“反派”盛名的大哥&#xff01;佐~~菲~~&#xff01; 还记得第一个登场&#xff0c;第一个进入我们的视野的那位吗&#xff1f;没错&#xff0c;那就是奥特曼 我的最爱~~~~~赛文&#xff01; 一度以为&#xff0c;曾经的那…

Bellhop 绘制传播损失

文章目录 前言一、相干传播损失&#xff08;TL&#xff09;基本算例1、环境文件2、绘制相干传播损失 二、相干、半相干和非相干传播损失&#xff08;TL&#xff09; 前言 上文我们讲述了 Bellhop 的使用以及使用 bellhop 绘制了声速剖面、声线轨迹及本证声线&#xff0c;本文我…

【SpringMVC】入门案例

前言: SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介请求与响应REST风格SSM整合(注解版)拦截器 SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用…

用户验证FTP实验

用户FTP实验 目录 匿名用户验证&#xff1a; 本地用户验证&#xff1a; 本地用户访问控制&#xff1a; 匿名用户验证&#xff1a; 例&#xff1a;&#xff08;前提配置&#xff0c;防火墙关闭&#xff0c;yum安装&#xff0c;同模式vmware11&#xff09; 现有一台计算机huy…

数据结构算法-图技术点(图的算法实现)

先看 定义邻接表 //边 struct Edge {int AdjVertex;//邻接顶点int Weight;//权值Edge* next;//下一条边 };using VertexValue use define//顶点 struct Vertex {VertexValue value; // 顶点数据Edge* First;//获取第一条边 }; //邻接顶点 using AdjVertex Vertex*; //邻接…

自动驾驶嵌入式开发工程师:车载SOC开发修炼秘籍

声明&#xff1a;本文档是博主在开发学习过程中写的笔记&#xff0c;本意是便于以后开发复盘&#xff0c;参考《 ug1144-petalinux-tools-reference-guide》、《ug1085》、黑金Zynq UltraScale MPSoC 5EV开发板资料、英伟达官方资料。大佬勿喷 大佬勿喷 大佬勿喷&#xff01;&a…

【资料分享】RS-485 串行接口说明

面对大量可用的串行接口&#xff0c;可能很难理解它们之间的差异以及何时使用它们。正如我最喜欢的工程学教授经常说的那样&#xff0c;“标准的美妙之处在于有很多标准可供选择。” 今天的编码器比以往任何时候都更智能、更先进&#xff0c;要求工程师放弃更简单的正交增量传感…

智能网联环境下数据安全分析与建设思考

01安全概况 随着智能化程度不断提升&#xff0c;汽车正逐渐从传统意义上的交通工具演化为公路上的智能终端&#xff0c;核心部件也从发动机、变速箱、底盘上升为芯片、软件与数据。相关机构研究表明&#xff0c;目前全球市场搭载智能网联功能的新车渗透率约为45%&#xff0c;预…

160个CrackMe之001

吾爱中的逆向练习题 运行程序 有两个方式 一个是账号登入 一个是序列号输入 账号输入 方法一 爆破 我们先进行账号输入 这个是最简单的逆向 所以我们可以使用 字符串查找看看 先试用ollydbg打开 右键 ->查找 ->所有参考文本字符串 这里我们能发现有两个报错 我们还…

《C++ deque的介绍以及stackh和queue的模拟实现》

文章目录 一、容器适配器1.1 什么是适配器1.2 STL中stack和queue的底层结构1.3 deque的简单介绍1.3.1 deque的原理介绍1.3.2 deque的结构1.3.3 deque和vector以及list的对比1.3.4 为什么选择deque作为stack和queue的适配容器 二、stack的模拟实现三、queue的模拟实现 一、容器适…

5个超实用视频素材网站,免费下载~

推荐几个高清无水印的视频素材网站&#xff0c;重点是可以免费下载使用&#xff0c;建议收藏&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 可以称之为最大素材库&#xff0c;在这里你可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有…

基于Nginx搭建LNMP

目录 一&#xff1a;安装 Nginx 服务 1、关闭防火墙、安装依赖包 2、创建运行用户 3、压缩包编译安装 4、优化路径 5、添加 Nginx 系统服务 二&#xff1a; 安装 MySQL 服务 1、安装Mysql环境依赖包 2、创建运行用户 3、编译安装 4、修改mysql 配置文件 5、更改mysql安装…

网络通信:http协议

虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议) 就是其中之一. 认识URL 统一资源定位符(Uniform Resource Locator&#xff0c;缩写&#xff1a;URL)&#xff0c;…

springboot + vue3实现视频播放Demo(video.js Vue3-video-play视频播放器)

文章目录 学习链接前言ffmpeg安装ffmpeg配置环境变量分割视频文件 后台配置WebConfig 前端代码video.js示例安装依赖视频播放组件效果 Vue3-video-play示例安装依赖main.js中使用视频播放组件效果 学习链接 ffmpeg官网 长时长视频java存储及vue播放解决方法 【 攻城略地 】vue…

AKStream部署1:ZLMediaKit流媒体服务器(win)

环境准备&#xff1a; windows10/11 visual stadio 2022(.net 6) cmake 3.22.0 git bash 没讲究直接下最新的 ffmpeg &#xff1a; ffmpeg-5.1.2-full_build VLC播放器&#xff1a;VLC media player ZLMediaKit&#xff1a;gitee地址 1、安装上述软件 例ffmpeg下载解压至某自定…

图片转pdf怎么转?一分钟解决

在日常生活中&#xff0c;我们常常需要将一些图片转换成PDF格式&#xff0c;以便于在电子设备上查看和分享。今天&#xff0c;我们将分享一些关于如何将图片转换成PDF的方法。 以下是三种常用的将图片转换成PDF的方法&#xff1a; 我们可以借助转换工具将图片转成PDF 如PDF转…

用esp8266连网的一些互联网知识

参考太极创客的课程资料添加链接描述 TCP/IP协议簇 在网络系统中&#xff0c;为了保证通信设备之间能正确地进行通信&#xff0c;必须使用一种双方都能够理解的语言&#xff0c;这种语言被称为“协议”。 TCP/IP协议簇是Internet的基础&#xff0c;也是当今最流行的组网形式…