【刷题】栈与队列:滑动窗口的最大值

news2024/11/30 0:52:37

题目

首先先来看题目描述:
在这里插入图片描述
这是一道栈与队列相关的题,给定我们一个整型数组,有一个长度为k的滑动窗口,让我们计算每次窗口的最大值。
我们的想法可以是得到一队列数据结构,让进入这个队列的第一个数据一定是最大的,而进入这个队列之后的数据在内部进行操作,每次移动数据一进一出,但是不影响我们的前提,就是第一个数据为队列的最大值,也就是滑动窗口的最大值。

思路分析

所以我们考虑实现下边的队列:

class myQueue
{
public:
    //确保为单调队列,所以小于插入的数时,都进行删除,之后再插入
    void push(int x)
    {}
    //确保第一个数一定为最大值
    void pop(int x)
    {}
    int max()
    {}
private:
};

在知道这个队列的大体结构之后,我们来实现这个队列的细节。
首先我要选择什么容器来实现这个队列呢?
vector可以吗?list可以吗?都可以,但是有观察过stl源码的同学都知道,stl的queue底层都是通过双端队列deque来实现的,他是一种特殊的数据结构,是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
在确定好什么容器来实现之后,我们来考虑pop,push应该如何实现。
pop很简单,我们要移除前边的数据时,我们来判断单调队列的队头与该数据是否相等,相等就说明该数据是上个滑动窗口的最大值,如果不相等,那么说明这个数据并没有在单调队列中,那么就不进行处理。
push呢?其实就是将一个数据从队尾开始比较,如果比队尾的数据大,那么就将队尾数据出队,当队列数据都比这个数大时,再进行入队,还是要确保这个队列是一个单调队列,并且队列第一个数据为最大值。
在这里插入图片描述
所以单调队列的代码可以这样实现:

class myQueue
{
public:
    //确保为单调队列,所以小于插入的数时,都进行删除,之后再插入
    void push(int x)
    {
        while(!dq.empty() && x > dq.back())
        {
            dq.pop_back();
        }
        dq.push_back(x);
    }
    //确保第一个数一定为最大值
    void pop(int x)
    {
        if(!dq.empty() && x==dq.front())
        {
            dq.pop_front();
        }
    }
    int max()
    {
        return dq.front();
    }
private:
    deque<int> dq;
};

代码实现

当实现好单调队列的代码之后,我们在主函数中只需要控制每次窗口滑动,一进一出就好了。
并且使用一个vector容器来保存每次队列的max最大值。

class myQueue
{
public:
    //确保为单调队列,所以小于插入的数时,都进行删除,之后再插入
    void push(int x)
    {
        while(!dq.empty() && x > dq.back())
        {
            dq.pop_back();
        }
        dq.push_back(x);
    }
    //确保第一个数一定为最大值

    void pop(int x)
    {
        if(!dq.empty() && x==dq.front())
        {
            dq.pop_front();
        }
    }
    int max()
    {
        return dq.front();
    }
private:
    deque<int> dq;
};
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> ret;
        myQueue mq;
        for(int i=0;i<k;i++)
        {
            mq.push(nums[i]);
        }
        ret.push_back(mq.max());

        for(int i = k;i<nums.size();i++)
        {
            mq.pop(nums[i-k]);
            mq.push(nums[i]);
            ret.push_back(mq.max());
        }
        return ret;
    }
};

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

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

相关文章

使用无线传感器网络进行源定位(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本文提出了一种用于反狙击应用的源定位过程&#xff1a;​使用广义互相关&#xff08;GCC&#xff09;方法确定到达时间差&…

uboot fatal error: configs/.h: No such file or directory 解决方法

环境 Win10 64位 ubuntu 20.04 虚拟机 VMware Workstation 16 Pro 开发板&#xff1a;NK-980IOT&#xff08;NUC980DK61Y&#xff09; gcc 交叉编译工具链&#xff1a; ARM 官方 gcc version 11.2.1 20220111 NUC980 uboot 版本 &#xff1a;尝试移植到 u-boot-2019.10&am…

【游戏逆向】《某山奇缘》发包函数

一个游戏我们拿来以后第一件事肯定是要去分析发包函数。 因为发包函数可以给我们很多有用的信息。 第一&#xff0c;所有的功能都可以通过发包实现。 第二&#xff0c;发包中的参数可以获悉游戏中的数据形式&#xff0c;例如某些参数是类型&#xff0c;ID是什么样的值。 第…

Java 中同步机制的几种方式及使用

在Java中&#xff0c;同步机制是用来解决多线程并发访问共享资源的问题。如果多个线程同时访问共享资源&#xff0c;可能会导致数据不一致、死锁等问题。Java中提供了多种同步机制&#xff0c;例如synchronized关键字、Lock接口、Semaphore类、CountDownLatch类等。本文将介绍J…

Vivado综合属性系列之二 SRL_STYLE

目录 一、前言 二、SRL_STYLE 2.1 移位寄存器实现方式 2.2 工程代码 2.3 参考资料 一、前言 移位寄存器SRL在工程中属于使用频率较高个模块&#xff0c;可用于存储数据&#xff0c;实现串并转换&#xff1b; 根据数据移动方向可分为左移寄存器&#xff0c;右移寄存器&#x…

Vue3-黑马(八)

目录&#xff1a; &#xff08;1&#xff09;vue3-进阶-antdv-分页 &#xff08;2&#xff09;vue3-进阶-antdv-搜索 &#xff08;3&#xff09;vue3-进阶-antdv-删除1 &#xff08;1&#xff09;vue3-进阶-antdv-分页 分页显示不对&#xff0c;修改下方分页条&#xff1a; …

Web 自动化笔记-第一章 Selenium 环境搭建

1.自动化测试能解决什么问题&#xff1f; 1. 解决-回归测试 2. 解决-压力测试 3. 解决-兼容性测试 4. 提高测试效率,保证产品质量 回归测试&#xff1a; 项目在发新版本之后对项目之前的功能进行验证 压力测试&#xff1a; 可以理解多用户同时去操作软件&#xff0c; 统计软件服…

近1500支队伍、6000名开发者齐聚,第三届Light技术公益创造营收官

在很多老年人看来&#xff0c;融入数字生活并不容易&#xff0c;经常误点广告、不时接到诈骗电话、不会操作智能手机……但有些老年人并不担心这些&#xff0c;“误点了付款&#xff0c;有人会打电话过来&#xff0c;提醒我不要被骗了。”一位老人放心地进行着“网上冲浪”。而…

Python程序员该如何提高薪资水平?我来谈谈实用的五大方法

今天我要跟小伙伴们讨论的话题是&#xff1a;Python程序员该如何提升自己的价值&#xff1f;换句话说&#xff0c;程序员该如何逐渐增加自己的薪资&#xff1f;我想这是大家都关心的一个问题。首先&#xff0c;我们要明确一点&#xff0c;程序员的价值所在是什么&#xff1f;关…

深度学习之图像分类(一):AlexNet

本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;MobileNet&#xff0c…

var、let、const和执行上下文

let/const/var let 基本语法 ES6新增了let命令&#xff0c;用于声明变量&#xff0c;其语法类似于var&#xff0c;但是所声明的变量只在let命令所在的代码块内有效 不存在变量提升 var命令会发生“变量提升”现象&#xff0c;即变量可以在声明之前使用&#xff0c;值为und…

【部署jar包到服务器】

部署打好的jar包到服务器 首先需要安装对应版本的jdk 查看所有可安装的jdk版本 yum -y list java 选择对应的安装 例如 yum install -y java-1.8.0-openjdk-devel.x86_64 安装好之后&#xff0c;查看jdk版本 java -version 默认安装位置在 usr/lib/jvm之中 倘若你之前的版本不对…

引爆海外市场:ChatGPT带来定制化营销活动的奇迹

在定制一场海外营销活动时&#xff0c;需要首先了解海外市场和定制营销活动的关键是研究目标市场的文化和消费习惯。这包括但不限于&#xff1a; 目标市场的语言和文化背景当地消费者的购买习惯和偏好该领域的市场趋势和竞争情况目标市场的法律法规、行业标准和规范推广渠道和…

编译opencv4.7.0 + opencv_contrib 记录

最近一个项目需要涉及到图像拼接算法&#xff0c;网上了解一番&#xff0c;也大致有思路&#xff1a; 1. 利用surf算法查找特征点 2. 过滤掉一些&#xff0c;获取good点 3. 然后进行配准&#xff08;图像扭曲&#xff09;&#xff0c;对接 4. 形成最终拼接图片 这些工作&a…

NeRF原理简介及实现

“ NeRF&#xff08;Neural Radiance Fields&#xff09;是一种先进的计算机图形学技术&#xff0c;能够使用深度全连接神经网络优化场景的连续5D函数表示&#xff0c;从而生成高度逼真的3D场景。该技术的优势在于没有使用离散化的网格或体素来表示场景&#xff0c;而是使用一个…

【Pandas与SQL系列】Pandas实现分布函数percent_rank、cume_dist

目录 1&#xff0c;分布函数,1.1&#xff0c;percent_rank()1.2&#xff0c;cume_dist()1.3 SQL例子 2&#xff0c;Pandas 实现3&#xff0c;补充Pandas实现排序 1&#xff0c;分布函数, 应用场景&#xff1a;快速查看某个记录所归属的组内的比例 分布函数分类及基础语法&…

asp.net952-sqlserver学生成绩信息管理系统开发

本学生管理系统主要学校内部提供服务&#xff0c;系统分为管理员&#xff0c;教师和学生三部分。 本研究课题重点主要包括了下面几大模块&#xff1a;用户登录&#xff0c;管理员管理,教师信息管理,学生信息管理,课程信息管理,考试信息管理,成绩信息管理系统设置等功能。这几个…

基于深度自编码网络实现轴承故障诊断

1.网络模型(数据集为CWRU) 代码实现了一个基于DAE的分类模型&#xff0c;用于对给定数据集进行分类。首先&#xff0c;通过DAE模型对原始数据进行特征提取和降维&#xff0c;然后使用分类模型将提取的特征与标签相匹配&#xff0c;以便对新数据进行分类。 代码的主要流程: 导…

用激光点云估算建筑高度【PDAL|PostgreSQL】

LiDAR 数据可以非常强大地提取城市规模的地面和物体的高程。 在 One Concern&#xff0c;我们正在使用 LiDAR 数据提取地面和建筑物高程&#xff0c;以改进进入我们的自然灾害模型的暴露信息&#xff0c;最终估计洪水和地震的影响。 由于 3DEP 项目预计将在 2023 年之前收集全…

STM32------GPIO

GPIO 一、介绍 1、1 什么是GPIO&#xff1f; 输入输出端口 1、2 GPIO特点 1、不同封装IO数量不一样。 2、快速翻转&#xff0c;每次翻转最快只需要两个时钟周期。 3、每个IO都可以做中断。 4、支持8种工作模式。 1、3 GPIO电气特性 STM32工作电压范围&#xff1a;2~3…