147.栈与队列:滑动窗口最大值(力扣)

代码解决

class Solution {
private:
    class MyQueue
    {
    public:
        deque<int> que;

        // 删除队列中的元素,如果该元素等于队列的front
        // 这是为了保持队列中元素的正确性
        void pop(int val)
        {
            if(!que.empty() && val == que.front())
            {
                que.pop_front();
            }
        }

        // 添加元素到队列,同时维护队列中的元素是降序的
        // 通过移除所有小于当前值的元素,保证队列中的最大值在front位置
        void push(int val)
        {
            while(!que.empty() && val > que.back())
            {
                que.pop_back();
            }
            que.push_back(val);
        }

        // 获取队列的最大值(即队列的front)
        int front()
        {
            return que.front();
        }
    };

public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) 
    {
        MyQueue que;
        vector<int> result;

        // 初始化前k个元素到队列
        for(int i = 0; i < k; i++)
        {
            que.push(nums[i]);
        }
        // 记录第一个窗口的最大值
        result.push_back(que.front());

        // 滑动窗口遍历后面的元素
        for(int i = k; i < nums.size(); i++)
        {
            // 移除窗口最左侧的元素
            que.pop(nums[i - k]);
            // 添加窗口最右侧的元素
            que.push(nums[i]);
            // 记录当前窗口的最大值
            result.push_back(que.front());
        }
        return result;
    }
};
  1. deque<int> que:

    • 使用双端队列来维护一个单调队列,队列中的元素是降序排列的。
  2. void pop(int val):

    • 如果队列不为空且要移除的值等于队列的前端值,则从队列中弹出该值。这一步是为了确保窗口的正确性。
  3. void push(int val):

    • 将新值 val 推入队列前,移除队列中所有小于 val 的元素。这保证了队列的降序性,因此队列的前端始终是最大值。
  4. int front():

    • 返回队列的前端值,这就是当前窗口的最大值。
maxSlidingWindow 方法
  1. MyQueue que:

    • 创建一个 MyQueue 实例来管理滑动窗口内的元素。
  2. vector<int> result:

    • 存储每个滑动窗口的最大值。
  3. 初始化前k个元素到队列:

    • 将前 k 个元素推入 MyQueue 中。
  4. result.push_back(que.front()):

    • 记录第一个滑动窗口的最大值。
  5. 滑动窗口遍历后面的元素:

    • 从第 k 个元素开始遍历到数组末尾:
      • 移除窗口最左侧的元素。
      • 添加窗口最右侧的元素。
      • 记录当前窗口的最大值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Databend 开源周报第 146 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持 Expressio…

winform安装时覆盖原版本并保留配置文件

如何打包参考大佬的博客添加链接描述 覆盖原版本 修改 Properties 下的 AssemblyInfo.cs 中的版本号&#xff0c;如下。原来是1.0.0.0&#xff0c;我修改成1.0.2。 选中 Setup 项目&#xff0c;修改 Version 属性修改 Version 属性后 ProductCode 也会改变&#xff0c;卸载程…

关于指针和数组的一些经典笔试题解析

前言 大家好&#xff0c;本篇博客将为大家展示一些曾经考过的关于指针的经典笔试题&#xff0c;里面有些题目的难度还是不小的&#xff0c;所以希望大家可以认真理解&#xff1b;如果你点开了本篇博客&#xff0c;麻烦各位大佬一键三连&#xff0c;多多支持&#xff0c;感谢&a…

小识MFC,一套设计优雅与不优雅并存的类库----小话MFC(2)

Q1&#xff1a; CPoint继承于POINT&#xff0c;这样有什么好处&#xff1f; A&#xff1a; 继承的一个最基本的好处当然就是减少代码量。CPoint和POINT内部数据一样&#xff0c;只是一个提供了更多的方法来操作对象。 typedef struct tagPOINT {LONG x;LONG y; } POINT, *P…

视频太大怎么压缩变小 视频太大了怎么压缩

视频作为一种多媒体形式&#xff0c;在当今社会的重要性日益凸显&#xff0c;其应用范围广泛&#xff0c;影响力深远。 但是视频文件的大小也在不断增加&#xff0c;这给存储和传输带来了很大的困扰。那么&#xff0c;当视频文件过大时&#xff0c;我们该如何将其压缩变小呢&am…

免费分享一套SpringBoot+Vue企业客户关系CRM管理系统【论文+源码+SQL脚本+PPT】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue企业客户关系CRM管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue企业客户关系CRM管理系统系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue企业客户关系CRM管…

MySQL(进阶)--索引

目录 一.存储引擎 1.MySQL体系结构​编辑 2.存储引擎简介 3.存储引擎特点 (1.InnoDB (2.MyISAM (3.Memory 4.存储引擎选择 二.索引 1.索引概述 2.索引结构 3.索引分类 4.索引语法 (1.创建索引 (2.查看索引 (3.删除索引 5.SQL性能分析 (1.SQL执行频率 (2.慢查…

基于stm32和HC_SR04超声波模块的测距和报警

基于stm32和HC_SR04超声波模块的测距和报警 目录 **基于stm32和HC_SR04超声波模块的测距和报警****一.工作原理****二.功能实现****HC_SR04初始化和读取距离****使用呼吸灯表示距离远近****主函数编写** **三.效果****四.关于modbus和串口RS485****五.总结** 一.工作原理 (1)采…

CISCN——2024——re——app-debug

输入检查类题型 package com.example.re11113;import android.os.Bundle; import android.util.Log; import android.view.View.OnClickListener; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; im…

生信网络学院|05月31日《SOLIDWORKS Manage 产品周期管理》

课程主题&#xff1a;SOLIDWORKS Manage 产品周期管理 课程时间&#xff1a;2024年05月31日 14:00-14:30 主讲人&#xff1a;付舰 生信科技 PLM实施顾问 1、SOLIDWORKS Manage介绍 2、周期流程管理 3、产品项目管理 4、项目会议管理 5、项目问题管理 安装腾讯会议客户端…

python的下载与安装

1.下载python 下载地址&#xff1a;Download Python | Python.org 进入到python的官网&#xff0c;点击downloads这个标签进入下载版本列表。 找到需要下载的版本&#xff0c;点击download。 选择executable这个文件类型进行下载。&#xff08;尽量不要选择zip会有文件缺失&a…

智能座舱-车载声学技术训练营

语音交互赋能车载智能终端&#xff0c;成为智能座舱生态构建的核心功能 曾几何时&#xff0c;至少十年前&#xff0c;车内语音交互&#xff0c;大家都认为是“智障”阶段&#xff0c;基本上除了难用作为评价找不到其他的形容词做修饰。 但是随着技术的不断发展&#xff0c;特别…

工作软件新宠儿

想要让你的工作效率飞起来吗&#xff1f;&#x1f440; 是时候告别那些大众化的工作软件啦&#xff01;今天&#xff0c;我要给大家种草几款不常见的但超级实用的工作软件&#x1f331;&#xff0c;保证让你事半功倍哦&#xff01;&#x1f31f; 1️⃣ 亿可达 它是一款自动化…

mySQL事务、存储引擎

什么是事务&#xff0c;事务特性————>保证数据完整性 1,事务是作为单个逻辑工作单元执行的一些列操作。 2,多个操作为一个整体向系统提交&#xff0c;要么执行&#xff0c;要么都不执行。 3,事务是一个不可分割的工作逻辑单元。 事务四特性&#xff1a; 原子性atomi…

滤布压滤机液压比例放大器

滤布压滤机是一种常用的固液分离设备&#xff0c;主要用于固体颗粒的过滤和脱水。其工作原理是通过压力对物料进行过滤和脱水处理。滤布压滤机主要由滤布、滤板、滤框、液压系统和辅助设备等组成。其中&#xff0c;滤布起到过滤和脱水的作用&#xff0c;滤板和滤框则用于支撑滤…

笔试强训week6

day1 Q1 难度⭐⭐ 小红的口罩_牛客小白月赛41 (nowcoder.com) 题目&#xff1a; 疫情来了&#xff0c;小红网购了 n 个口罩。 众所周知&#xff0c;戴口罩是很不舒服的。小红每个口罩戴一天的初始不舒适度为 ai​。 小红有时候会将口罩重复使用&#xff08;注&#xff1a;…

表空间[MAIN]处于脱机状态

达梦数据库还原后&#xff0c;访问数据库报错&#xff1a;表空间[MAIN]处于脱机状态 解决方法&#xff1a; 1&#xff1a;检查备份文件 DMRMAN 中使用 CHECK 命令对备份集进行校验&#xff0c;校验备份集是否存在及合法。 ##语法&#xff1a;CHECK BACKUPSET <备份集目录…

育菁桌面式数控机床助力教育装备

桌面式数控机床是一种小型化的数控机床&#xff0c;它通常具有紧凑的设计和较小的体积&#xff0c;可以放置在桌面上进行操作。 这种车床结合了数控技术&#xff0c;通过计算机编程来控制机床的运动和加工过程&#xff0c;以实现高精度、高效率的工件加工。 桌面式数控车床是一…

Linux服务器配置ssh证书登录

1、ssh证书登录介绍 Linux服务器ssh登录有密码登录和证书登录两种。如果使用密码登录&#xff0c;容易遭受密码泄露或者暴力破解&#xff0c;我们可以使用ssh证书登录并禁止使用密码登录&#xff0c;ssh证书登录通过公钥和私钥来完成整个连接过程&#xff0c;公钥保存在服务器…

君正X2100 RTOS 修改UVC友好名称

修改UVC友好名称 SDK中默认的名称为"UVC Camera"。 相关文件f_uvc.c&#xff0c;具体内容&#xff1a; static struct usb_string uvc_en_us_strings[] {[UVC_STRING_CONTROL_IDX].s "UVC Camera",[UVC_STRING_STREAMING_IDX].s "Video Streamin…