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

news2024/12/25 2:29:46

_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/100472.html

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

相关文章

彻底弄清SpringSecurity登录原理及开发步骤

SpringBootVue之SpringSecurity登录与授权(一) 工具&#xff1a;idea2018&#xff0c;springboot 2.1.4&#xff0c;springsecurity 5.1.5 简介 SpringSecurity是Spring下的一个安全框架&#xff0c;与shiro 类似&#xff0c;一般用于用户认证(Authentication)和用户授权(Autho…

【案例教程】MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估及论文写作技巧

【查看原文】基于MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估及论文写作技巧 随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自…

ruoyi导入数据,第二次导入相同文件时,覆盖原数据;

考勤记录表——在导入时——应该做判断——避免重复导入成功报错 1.现在是&#xff0c;可以多次成功导入同一个文档&#xff0c;导致数据展示出错 期望&#xff1a; 导入文件时&#xff0c;如果这个文件名内数据select值不为0&#xff0c;那么覆盖表数据&#xff08;update&…

vue组件库搭建报错问题(vue-loader报错、gulp打包css报错,包含组件库打包文件webpack及gulp)

1、vue-loader报错 报错详情 vue-loader 17.0.0运行webpack打包命令时会报错&#xff1a; 解决方法&#xff1a; 需适配版本&#xff1a;将package.json&#xff0c;vue-loader版本修改为 “vue-loader”: “^15.10.0”&#xff0c;删除本地node_modules文件夹&#xff0c;重…

这让人眼前一亮的MySQL14个小玩意

前言 我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中…

整个网页设置为全灰

前段时间&#xff0c;不是全网变灰色了嘛&#xff0c;整个网页的按钮、文本框、图片、文字等等都变成了灰蒙蒙的了&#xff0c;这是怎么做到的呢&#xff1f; 案例如下&#xff1a; 我就随便写个普通的html网页吧&#xff0c;在网页里随便写点文字和随便放几张图片(大概意思下…

TensorFlow安装与配置教程(2022.12)

1. TensorFlow的安装 首先需要安装 Anaconda 环境&#xff0c;可以转至&#xff1a;Anaconda3安装与配置教程&#xff08;2022.11&#xff09;。 然后我们打开 Anaconda&#xff0c;创建一个 TensorFlow 环境&#xff1a; conda create -n TensorFlow python3.9进入 TensorF…

API接口相关设计及基础知识

接口开发 API接口是什么 接口&#xff1a;预先定义的函数逻辑&#xff0c;供其他系统请求&#xff0c;然后返回结果 为什么需要API接口 核心需求&#xff1a;利用现有接口降低开发成本&#xff0c;缩短开发时间 API接口的核心是什么 接口地址请求参数&#xff08;报文&am…

OPEN ALLIANCE TC2和TC9线束以太网测试标准?何种设备可以满足测试?除了矢量网分之外

OPEN ALLIANCE TC2和TC9线束以太网测试标准&#xff1f; 联盟中TC2汽车线束以太网线束定义标准&#xff1a; 100BASE-T1 Ethernet Channel & Components 100BASE-T1 offers a way to introduce modern signal processing in automotive, which allows optimal usage of th…

Prometheus Operator实战—— Prometheus、Alertmanager、Grafana 监控Springboot服务

1. Spring Boot 工程集成 Micrometer 1.1引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency><groupId>io.micrometer&l…

JVM简单介绍

JVMJVM内存区域划分JVM类加载机制JVM垃圾回收机制【哪些内存需要被JVM中垃圾回收机制回收】【JVM中垃圾回收机制的基本单位】【JVM中垃圾回收机制是如何判断对象是否是垃圾】【如何回收垃圾】JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。虚拟机是指通过软…

电巢:半导体ATE国产化产业探究(附国内外厂家汇总)

前言 2022年10月7日&#xff0c;美国BIS发布近年来范围最大半导体管制举措&#xff0c;管控范围包括芯片、设备、零部件、人员等。 12月6日下午&#xff0c;全球最大晶圆代工厂台积电&#xff0c;在美国亚利桑那州凤凰城高调举行了首批机台设备迁机仪式。 据联合早报12月8日报道…

分蛋糕

题目描述 SYCSYC在每个阶段结束(语言阶段、基础算法、提高算法)后,都会切蛋糕 现在MasMas有一个蛋糕,他希望将蛋糕分成nn份 规定一刀合法的蛋糕切法为符合以下两种条件之一 一刀的切痕迹是一条线段,线段两个端点在圆上,且线段经过圆心(切痕为圆的直径) 一刀的切痕迹是一条线…

[附源码]计算机毕业设计Python电商小程序(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

2023年数字信号处理前沿国际会议(CFDSP 2023)

2023年数字信号处理前沿国际会议&#xff08;CFDSP 2023&#xff09; 重要信息 会议网址&#xff1a;www.cfdsp.org 会议时间&#xff1a;2023年2月24-26日 召开地点&#xff1a;新加坡 截稿时间&#xff1a;2022年12月31日 录用通知&#xff1a;投稿后2周内 收录检索&am…

【OpenCV】SURF图像拼接和Stitcher拼接

介绍两种图像拼接的方法&#xff0c;一种是SURF算法的图像拼接&#xff0c;另一种是Stitcher硬拼接 首先先从简单的讲起 一、Stitcher直接拼接 可以实现多张图片一起拼接&#xff0c;只要两行代码就可以实现拼接&#xff1b; 1.首先准备多张图片&#xff0c;放入向量容器中…

PDF如何插入空白页?3 次点击在PDF中插入空白页!

由于工作和学习的需要&#xff0c;您可能需要在现有的PDF文件中插入一张空白页或几页PDF&#xff0c;使之成为一个完整的PDF文件。但是&#xff0c;PDF文件实际上是最终作品&#xff0c;似乎不可能向其添加额外的页面。事实上&#xff0c;将空白页或 PDF 文件插入现有 PDF 文件…

Conv2Former ~2

还是来说Conv2Former~~ 上次发了一次~~ 一种卷积调制模块&#xff0c;利用卷积来建立关系&#xff0c;这比注意力机制在处理高分辨率图像时更高效&#xff0c;称为 Conv2Former。作者在 ImageNet 分类、目标检测和语义分割方面的实验也表明&#xff0c;Conv2Former 比以前基于…

【2022.12.19】备战春招Day14——每日一题 + 234. 回文链表 + 860. 柠檬水找零

【每日一题】1971. 寻找图中是否存在路径 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n -1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi之间的双向边。…

昆仑万维的AI作画简直就是业界天花板

AI作画的业界天花板被我找到了&#xff0c;AIGC模型揭秘 | 昆仑万维。 一、前景 1、AI和AIGC的关系 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的…