Acwing 154. 滑动窗口

滑动窗口

在这里插入图片描述
在这里插入图片描述
输入:

8 3
1 3 -1 -3 5 3 6 7

输出:

-1 -3 -3 -3 3 3
3 3 5 5 6 7

思路:

使用双端队列(deque)来维护一个区间的最值

具体做法:
  双端队列里面存储元素的下标,我们先考虑如何维护区间里的数:一、保证队列里的下标是升序的,这样有利于维护在区间里的数。:当枚举到第i个元素时,维护队首值大于等于i - k + 1二、如何保证最值?1、最小值:当枚举到第i个元素时,我们从队尾开始往前判断,删除所有大于等于a[i]的下标,这样我们就保证剩下的都是小于a[i]的(即队首肯定是最小的)。最大值 :当枚举到第i个元素时,我们从队尾开始往前判断,删除所有小于等于a[i]的下标,这样我们就保证剩下的都是大于a[i]的(即队首肯定是最大的)。

数组维护单调队列代码:

#include<iostream>
#include<stack>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#include<deque>using namespace std;
const int maxn = 1e6 + 10;int a[maxn];int q[maxn]; // 单调队列int main(){int n, k;cin >> n >> k;for(int i = 1; i <= n; i ++ ) cin >> a[i];int h = 1, t = 0; // 队首 h = 1, 队尾初始为 0, 入队为 q[++t] = xfor(int i = 1; i <= n; i ++ ){ // 维护区间最小值while(h <= t && a[q[t]] >= a[i]) t --; // 将前面大于等于 a[i]的都删除 q[ ++ t] = i; // 将第 i 下标入队if(q[h] < i - k + 1) h ++; // 判断队头的下标是否越界if(i >= k) cout << a[q[h]] << " "; // 如果区间长度够了,就开始输出 每个区间最小值}cout << endl;h = 1, t = 0; // 初始化单调队列for(int i = 1; i <= n; i ++ ){ // 维护最大值while(h <= t && a[q[t]] <= a[i]) t --; //将前面小于等于 a[i]的都删除q[ ++ t] = i; //  将第 i 下标入队if(q[h] < i - k + 1) h ++;// 判断队头的下标是否越界if(i >= k) cout << a[q[h]] << " ";// 如果区间长度够了,就开始输出 每个区间最大值}return 0;
}

STL单调队列代码:

#include<iostream>
#include<stack>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#include<deque>using namespace std;
const int maxn = 1e6 + 10;int a[maxn];// int q[maxn];
deque<int> q;int main(){int n, k;cin >> n >> k;for(int i = 1; i <= n; i ++ ) cin >> a[i];for(int i = 1; i <= n; i ++ ){while(q.size() && a[q.back()] >= a[i]) q.pop_back();q.push_back(i);if(q.front() < i - k + 1) q.pop_front();if(i >= k) cout << a[q.front()] << " ";}cout << endl;q.clear();for(int i = 1; i <= n; i ++ ){while(q.size() && a[q.back()] <= a[i]) q.pop_back();q.push_back(i);if(q.front() < i - k + 1) q.pop_front();if(i >= k) cout << a[q.front()] << " ";}return 0;
}

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

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

相关文章

Elasticsearch讲解

1.Elasticsearch基本知识 1.基本认识和安装 Elasticsearch是由elastic公司开发的一套搜索引擎技术&#xff0c;它是elastic技术栈中的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索 Logstash/Beats&#xff1a;用于数据收集 Kib…

Harbor的安装与使用

任务分析 一、规划节点 IP地址 主机名 节点 192.168.20.20 master 容器master节点 192.168.20.21 node 容器worker节点 二、基础准备 镜像使用CentOS7.9&#xff08;主机配置自定义&#xff0c;推荐配置4vCPU/12G内存/100G硬盘&#xff09;&#xff0c;使用这两台云…

【软设】计算机网络

【软设】计算机网络 一.OSI/RM七层模型 (七层模型还是要知道的&#xff0c;后面再去记一些协议&#xff0c;知道每一层应用在哪些方面&#xff0c;给你个东西或者协议你要能看得出来) OSI/RM&#xff08;Open Systems Interconnection Reference Model&#xff09;是国际标准…

63.HDMI显示器驱动设计与验证-彩条实验

&#xff08;1&#xff09;常见的视频传输接口有三种&#xff1a; VGA 接口、 DVI 接口和 HDMI 接口&#xff0c;目前的显示设备都配有这三种视频传输接口。三类视频接口的发展历程为 VGA→DVI→HDMI。其中 VGA 接口出现最早&#xff0c;只能传输模拟图像信号&#xff1b; 随后…

【libp2p——NAT】

1. 什么是NAT NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是指一种网络技术&#xff0c;它允许多个设备通过一个公共IP地址连接到互联网。NAT通常被用在家庭或小型办公室的路由器上&#xff0c;以允许多台计算机共享一个互联网连接。这种…

深入理解函数【JavaScript】

在 JavaScript 中&#xff0c;函数作为一种重要的基本结构&#xff0c;承载着编程中的许多关键概念。下面是与函数相关的内容介绍&#xff1a; 1. 函数定义 JavaScript 中有多种方式定义函数&#xff1a; 1.1 函数声明&#xff08;Function Declaration&#xff09; functi…

C# 委托(Delegate)一

一.Delegate的定义说明&#xff1a; C# 中的委托&#xff08;Delegate&#xff09;就是类似于 C 或 C 中函数的指针。Delegate 是存有对某个方法引用的一种引用类型变量&#xff0c;引用可在运行时是可以被改变的&#xff0c;特别适用于实现事件和回调方法。所有的Delegate都是…

C# 委托(Delegate)二

一.委托的多播&#xff08;Multicasting of a Delegate&#xff09;&#xff1a; 委托对象&#xff0c;使用 "" 运算符进行合并&#xff0c;一个合并委托调用它所合并的两个委托。使用"-" 运算符从合并的委托中移除组件委托。 注&#xff1a;只有相同类型…

linux文件下载分类

在下载图片时各个网站命名不统一&#xff0c;管理起来很麻烦&#xff0c;想要写一个脚本将下载的图片或者其他资源实现格式统一&#xff0c;方便管理 $0&#xff1a;表示脚本路径。运行 ./myscript.sh&#xff0c;$0 将会保存 ./myscript.sh。 $1&#xff1a;表示传递给脚本的…

Leetcode 968. 监控二叉树 树形dp、状态机 C++实现

问题&#xff1a;Leetcode 968. 监控二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 /*** Definition for a binary tree node.* struct TreeNo…

数据结构 ——— 移除元素(快慢指针)

目录 题目要求 代码实现&#xff08;快慢指针&#xff09; 题目要求 编写函数&#xff0c;给你一个数组 nums 和一个值 val&#xff0c;你需要在 nums 数组 原地 移除所有数值等于 val 的元素&#xff0c;并且返回移除后数组的新长度 不能使用额外的数组空间&#xff0c;要…

数据统计与分析-Numpy入门

Numpy入门 导包1.演示Numpy的属性演示打印Numpy数据类型shape()形状维度ndim() 轴dtype() 元素类型size()元素个数itemsize()每个匀速所占大小 2.创建Numpy对象2.1数组方式创建,函数:arrray()2.2创建空的ndarray对象2.2.1 zeros()2.2.2 ones()2.2.3 empty() 2.3创建1个指定范围…

大数据毕业设计选题推荐-内蒙古旅游景点数据分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【智能控制】16章 基于Hopfield网络的路径优化,TSP问题

目录 15.6 基于Hopfield网络的路径优化 15.6.1 TSP问题 15.6.2 求解TSP问题的Hopfield神经网络设计 15.6 基于Hopfield网络的路径优化 15.6.1 TSP问题 旅行商问题&#xff08;Traveling Salesman Problem&#xff0c;简称TSP&#xff09;可描述为&#xff1a;已知N个城市之…

C# 的枚举(Enum)应用说明

一.Enum的定义&#xff1a; 枚举是一组命名整型的常量。枚举类型是使用 enum 关键字声明的&#xff0c;它是值类型。枚举包含自己的值&#xff0c;且不能继承或传递继承。 二.声明 enum 变量&#xff1a; 声明枚举的一般语法&#xff1a; enum <enum_name> { enumerati…

如何使用ssm实现基于BS的库存管理软件设计与实现+vue

TOC ssm708基于BS的库存管理软件设计与实现vue 绪论 课题背景 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化。目前&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得到…

FPGA学习(1)-mux2,2选1多路器

目录 1 开发板配套资料 1.1学习网址和资料网址 2.创建工程文件 2.1创建过程 2.2写程序及仿真测试 2.2.1 写程序生成电路 2.2.2仿真 2.2.3 生成执行文件并烧录 3.实验现象 买的小梅哥店铺的开发板&#xff1a;xc7z020clg400 看的小梅哥的视频&#xff1a;03C _基于ZYN…

Oracle 相关的工具使用 SQL Developer , sqlplus

Oracle 相关的工具使用 SQL Developer &#xff0c; sqlplus 一&#xff0c;Oracle SQL Developer 连接数据库 今天在连接sqldeveloper服务器时遇到了很多问题&#xff0c;但最终还是通过网上的博客解决了问题&#xff0c;我就在总结一下我的解决过程。 一.界面 首先&#…

混拨动态IP代理的优势是什么

在当今互联网时代&#xff0c;隐私保护和网络安全成为了人们关注的焦点。无论是个人用户还是企业&#xff0c;都希望能够在网络上自由、安全地进行各种活动。混拨动态IP代理作为一种新兴的技术手段&#xff0c;正逐渐受到大家的青睐。那么&#xff0c;混拨动态IP代理到底有哪些…

c语言常量变量

c语言常量变量 const 修饰常变量 #define定义标识符常量 #define num 10 //这里不需要分号int anum;enum枚举常量 enum Color {RED,GREEN,BLUE }; int main(){enum Color cRED;//枚举常量不允许修改 }//定义常量 int a10; char ba;错误语法注意 //定义常变量 const int a10…