_11LeetCode代码随想录算法训练营第十一天-C++队列的应用

news2025/3/12 14:00:19

_11LeetCode代码随想录算法训练营第十一天-C++队列的应用

  • 239.滑动窗口最大值
  • 347.前K个高频元素

239.滑动窗口最大值

整体思路

要实现一个单调递减队列:

对于滑动窗口的滑动,移除前面的元素,加入后面的元素。当移除前面的元素时,如果当前这个元素等于队头元素,那么就出队;当加入后面的元素时,如果队尾的元素小于这个元素,那么就将队尾元素出队,直到队尾元素小于这个元素时,将这个元素入队。这样队首元素即为当前滑动窗口的最大值。

这样的队列维护了每次滑动窗口的最大值信息,而且不用存储滑动窗口所有的值,就挺好的。

代码

/*
 * @lc app=leetcode.cn id=239 lang=cpp
 *
 * [239] 滑动窗口最大值
 */

// @lc code=start
class Solution {
private:
    class myQuene
    {
    private:
        deque<int> dq;//这是一个双向队列,可以从队首队尾都可以作为入口和出口
    public:
        void push(int data)
        {
            //出队列的情况
            while(!dq.empty() && data > dq.back())
                dq.pop_back();
            dq.push_back(data);
        }
        void pop(int data)
        {
            //入队列的情况
            if(!dq.empty() && dq.front() == data)
                dq.pop_front();
        }
        int front()
        {
            return dq.front();
        }
    };
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;
        myQuene mq;
        //首先将前k个元素入队列
        for(int i = 0; i < k; i++)
        {
            mq.push(nums[i]);
        }
        //将第一个滑动窗口的最大值存起来;
        res.push_back(mq.front());
        for(int i = k; i < nums.size(); i++)
        {
            mq.pop(nums[i-k]);
            mq.push(nums[i]);
            res.push_back(mq.front());//将当前滑动窗口的最大值存储起来
        }
        return res;//返回结果
    }
};
// @lc code=end

347.前K个高频元素

优先级队列

优先级队列对外接口只是从队头取元素,从队尾添加元素。

优先级队列内部元素是自动依照元素的权值排列。

排列的方式:缺省情况下priority_queue利用max-heap(大顶堆)完成对元素的排序,这个大顶堆是以vector为表现形式的complete binary tree(完全二叉树)。

堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。

整体思路

为什么不用快排?

使用快排要将map转换为vector的结构,然后对整个数组进行排序, 而这种场景下,我们其实只需要维护k个有序的序列就可以了,所以使用优先级队列是最优的。

使用大顶堆还是小顶堆?

使用大顶堆的话,每次弹出的是最大值,然后大顶堆里面存储的就不是频率为前k的元素;使用小顶堆的话,每次弹出的是最小值,然后小顶堆里面存储的就是频率为前k的元素。

在这里插入图片描述

代码

/*
 * @lc app=leetcode.cn id=347 lang=cpp
 *
 * [347] 前 K 个高频元素
 */

// @lc code=start
class Solution {
public:
    class myCompare{
        public:
        bool operator()(pair<int,int>& left,pair<int,int>& right)
        {
            return left.second > right.second;
        }
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {
        //统计元素出现的频率
        unordered_map<int, int> map;
        for(int data : nums)
        {
            map[data]++;
        }
        //对频率进行排序
        //这里的第三个参数必须是类,不能是函数
        priority_queue<pair<int, int>, vector<pair<int, int>>, myCompare> priQueue;
        for(auto it = map.begin(); it != map.end(); it++)
        {
            priQueue.push(*it);
            if(priQueue.size() > k)
                priQueue.pop();
        }
        //取出元素
        vector<int>res;
        for(int i = 0; i < k; i++)
        {
            res.push_back(priQueue.top().first);
            priQueue.pop();
        }
        return res;
    }
};
// @lc code=end

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

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

相关文章

监控物联网卡该如何选择,你都踩过哪些坑?

不知道大家有没有发现在自己的身边不知不觉多了很多新玩意&#xff0c;例如智能自动售货机、共享单车、智能监控设备等&#xff0c;它们让大家的生活变得越来越方便&#xff0c;那么大家知道它们为什么能起到这么大的作用吗&#xff0c;其实得得益于一个叫做物联网卡的东西。前…

通过kubeode安装k8s

文章目录通过kubeode安装k8s1、准备vmdk文件2、创建虚拟机3、进入虚拟机4、配置yum源5、清理6、 增加node服务器7、修改Ip8、下载下载通道01 走普通家庭宽带下载点下载通道02 走群友无私赞助电信机房专线服务器--高速稳定下载----强烈推荐下载并解压9、一键安装通过kubeode安装…

字符串函数剖析(1)

带你玩转字符串 1.strlen函数不一样的细节 1.1模拟实现strlen函数 2.strcpy函数的巧妙 2.2strcpy的模拟实现 3.strcmp函数的巧妙 3.2strcmp的模拟实现 详解strlen的细节 首先了解strlen 函数的参数 size_t strlen ( const char * str );size_t 是什么东西呢&#xff1f…

链表-------数据结构

链表(重点): 链表是物理存储结构上面非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 1)在顺序表中&#xff0c;我们不光引入了一段连续的内存&#xff0c;还引入了一块连续的内存空间&#xff0c;叫做usedsize&#xff0c;来表示对应数组中…

PMP每年考几次,费用如何?

PMP每年考四次&#xff0c;整个考证一次通关大致需要 7000 元左右&#xff0c;主要是下面几项费用&#xff1a; 部分学习笔记&#xff1a; 一、考证费用 分为基础费用报班费用 基础费用&#xff1a;报名费续证费用&#xff08;补考费 / 退考费&#xff09; 报名费 3900 元是固…

【软件测试】测试人的内卷,掀起血雨腥风......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 铺天盖地的职场内卷…

如何利用深度学习中的AutoEncoder进行特征降维和特征可视化,pytorch代码

我们将使用 Pytorch 中的 AutoEncoder(自动编码器架构)来减少特征维度和可视化。 北大出版社&#xff0c;人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理 人工智能原理与实践 全面涵盖人工智能和数据科学各个重要体系经典 首先&#xff0c…

力扣(142.1002)补9.17

142.环形链表Ⅱ 不会&#xff0c;不过答案用了数学的想法&#xff0c;我以为计算机里只有暴力呢。 public class Solution { public ListNode detectCycle(ListNode head) { if(headnull||head.nextnull) return null; ListNode phead; ListNode p2head; while(true){ if(p2.ne…

Excel教程之学生成功所需的 5 个电子表格

作为一名学生,跟踪你盘子里的所有任务和责任可能会让人不知所措。 这就是为什么拥有一套组织良好的电子表格可以成为救命稻草的原因。出于多种原因,维护自己的电子表格可能是一项宝贵的技能。首先,它可以帮助您养成良好的习惯,例如组织和关注细节。通过创建和维护您自己的…

RabbitMQ之Exchange(交换机)

目录 一、Exchange简介 二、Exchange(交换机)的类型 1.直连交换机&#xff1a;Direct Exchange 2.主题交换机&#xff1a;Topic Exchange 3.扇形交换机&#xff1a;Fanout Exchange 4、默认交换机 5、Dead Letter Exchange&#xff08;死信交换机&#xff09; 三、交换机…

Conan 上传预编译的包

目录 1. 组织文件 2. 编写conanfile.py 3. 然后执行export 命令 4. 上传到自己的center 疫情肆虐&#xff0c;阳了一周&#xff0c;今天可以正常工作了&#xff0c;刚接触conan, 确实一脸懵逼&#xff0c;今天的任务是把项目转成Conan 管理&#xff0c;因为项目用到了第三方…

R语言学习笔记——扩展篇:第十九章-使用ggplot2进行高级绘图

R语言 R语言学习笔记——扩展篇&#xff1a;第十九章-使用ggplot2进行高级绘图 文章目录R语言一、R中的四种图形系统二、ggplot2包介绍三、用几何函数指定图的类型四、分组&#xff08;重叠图形&#xff09;五、刻面&#xff08;并排图形&#xff09;六、添加光滑曲线七、修改…

SpringMVC的AOP总结

SpringMVC的AOP总结 1、Filter 过滤器 Filter是Servlet规范中规定的&#xff0c;只能用于WEB中, 在Servlet前后起作用 它可以对几乎所有请求进行过滤&#xff0c;但是缺点是一个过滤器实例只能在容器初始化时调用一次 使用场景: 修改字符编码; 对入参进行校验, 校验不通过返回…

java实验报告之Employee类的设计

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2022.12.20 Last edited: 2022.12.20 目录 一、实验目的 二、实验内容 三、总体设计&#xff08;设计原理、设计方案及流程等&#xff09; 四…

Python数据结构+算法全面讲解:定义函数、定义类

之前的过程抽象例子调用了 Python数学模块中的 sqrt 函数来计算平方根。通常来说,可以 通过定义函数来隐藏任何计算的细节。函数的定义需要一个函数名、一系列参数以及一个函数体。 函数也可以显式地返回一个值。例如,下面定义的简单函数会返回传入值的平方。 >>> …

使用 Appium 报错“... Could not find ‘adb‘ in ...”

使用 Appium 报错 “... Could not find adb in ...”1. 现象2. 问题定位3. 解决方案4. 验证1. 现象 在 Robot Framework 中使用 Open Application 关键字以通过 Appium 来打开模拟器上的应用报错&#xff1a; WebDriverException: Message: An unknown server-side error occ…

Transformer17

还是transformer 这次还是谷歌哈 又在机器人领域发力 谷歌机器人团队等在机器人领域构建了一个多任务 transformer 模型&#xff0c;显著改进了对新任务、环境和对象的零样本泛化。轻松完成700多条指令、成功率达97%&#xff01;谷歌开源机器人领域 我们知道&#xff0c;机器…

Docker搭建MySQL主从集群

使用Docker搭建一主一从的MySQL集群&#xff0c;使用的是8版本的MySQL镜像不是8的版本部分命令会无效&#xff0c;宿主机任意 规划 端口角色3307master3308slave 思路 事先准备 要确保linux宿主机已经安装上Docker。然后将MySQL镜像下载到本地 &#xff0c;可以先去Docker Hu…

ssm java mysql_医院门诊管理系统_

息化不断建设发展的今天&#xff0c;医院看病预约&#xff0c;医生的挂号等&#xff0c;已经十分方便&#xff0c;通过在线挂号&#xff0c;医生的查看&#xff0c;就能够了解到医院的门诊基本信息&#xff0c;并且可以在线进行门诊的医生查看&#xff0c;医院最新的资讯等&…

Golang 【basic_leaming】切片

阅读目录1、为什么要使用切片2、切片的定义3、关于nil 的认识4、切片的循环遍历5、基于数组定义切片6、切片再切片7、关于切片的长度和容量8、切片的本质9、使用 make() 函数构造切片10、切片不能直接比较11、切片是引用数据类型 -- 注意切片的赋值拷贝12、append() 方法为切片…