3.2滑动窗口

news2024/11/14 17:28:48

滑动窗口***

题目链接
视频讲解
属于单调队列的模板题

如果每次移动窗口,然后在窗口中循环遍历查找最大值,时间复杂度太高
解决思路
维护一个单调队列,其中head永远指的是当前窗口中最大的值,从head到tail元素递减。
每次移动滑动窗口时,有两种情况:

  1. 如果新增加的数大于等于队尾元素,由于新遍历到的数字比队尾元素大,那么在之后的移动中,它一定比队尾元素有用,那么就删除队尾元素,然后暴露出的新的队尾元素再次和新遍历的对比,直到遇到队列中已有的元素比队尾大或者队列中没有元素。(在相等的情况下,因为新遍历到的数字一定更晚被移除去,因此也比队列中已有的数字好)
  2. 如果新增加的数小于队尾元素小于队尾元素,因此他就比队列中所有元素都小,不过在以后移动的过程中,可能前面的元素不断出队列,因此他可能会成为大的元素,因此直接进入队列

但是这道题写好之后,犯了一些低级错误

  1. 未注意到数量级是10e6,按照之前做题习惯还是设置了1e5
  2. 中间输出换行时,写成了cout<<"\n"<<endl;这玩意是两个换行
  3. 未考虑到k=1的特殊情况,其实这样的错误可以通过刚开始直接上k个元素解决,不过我感觉这样不够美观就没有这么写。这说明一件事(在写if条件时候,不仅要注意本身的逻辑判断,还要考虑所用数据结构会不会越界之类的,对于元素的值有着逻辑判断,对元素的下标也应该有一定的约束,如果有确定的条件约束尽量写上
  4. 队列中实际存储的是下标,在部分代码中记得,部分判断代码中却忘记了,直接将a[i]和q[i]进行大小比较了,应该是a[i]和a[q[i]]的比较😅

为了容易判断在滑动窗口移动过程中,队列中最大的元素是否已经被移出,队列中实际存储的并不是值,而是下标

在这里插入图片描述


#include<iostream>

using namespace std;

const int N=1e6+10;
int n,k;
int q[N],a[N];
int head=1; int tail=1;//这里用head指向第一个元素,tail指向队尾元素的下一位 

int main(){
	
	cin>>n>>k;	
	
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	
	//这个是用来求最小的,解析详见后面最大的 
	
	for(int i=1;i<=n;i++){
		//检查当前队头元素是否已经超出窗口范围 
		if(q[head]<=(i-k)&&i>k){
			head++;
		}
		//遍历数组a[]
		if(head==tail||a[i]>q[tail-1]){
			q[tail]=i;			  
			tail++;				 
		}
		else{  
			while(a[i]<=a[q[tail-1]]&&head<tail){
				tail--;
			}
			q[tail]=i; 
			tail++;
		} 
		//前几个不打印 
		if(i>=k){
			cout<<a[q[head]]<<" ";
		}
	}
	
	cout<<"\n";
	
	head=tail=1;//初始化 
	
	for(int i=1;i<=n;i++){
		//检查当前队头元素是否已经超出窗口范围 
		if(q[head]<=(i-k)){
			head++;
		}
		//遍历数组a[]
		if(head==tail||a[i]<q[tail-1]){//如果当前队列为空,或者遍历的元素小于队尾元素,
			q[tail]=i;			  //注意队尾是tail-1,那么直接把元素(下标)放进去 
			tail++;				 
		}
		else{ //如果当前遍历元素更大或等于,那就在队列中删除直到找到一个比当前元素更大的 
			while(a[i]>=a[q[tail-1]]&&head<tail){
				tail--;
			}
			q[tail]=i;//这里为何是tail自己画个图看下 
			tail++;//因为tail始终指向的是队列中最后一个元素的下一位 
		} 
		//前几个不打印 
		if(i>=k){
			cout<<a[q[head]]<<" ";
		}
	}
	
	
	return 0;
} 

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

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

相关文章

【Unity VR开发】结合VRTK4.0:创建圆盘

语录&#xff1a; 茶若相似&#xff0c;味不必如一。但凡茗茶&#xff0c;一泡苦涩&#xff0c;二泡甘香&#xff0c;三泡浓沉&#xff0c;四泡清洌&#xff0c;五泡清淡&#xff0c;此后&#xff0c;再好的茶也索然无味。诚似人生五种&#xff0c;年少青涩&#xff0c;青春芳…

【并发基础】Java中线程的创建和运行以及相关源码分析

目录 一、线程的创建和运行 1.1 创建和运行线程的三种方法 1.2 三者之间的继承关系 二、Thread类和Runnable接口的区别 2.1 Runnable接口可以实现线程之间资源共享&#xff0c;而Thread类不能 2.2 实现Runnable接口相对于继承Thread类的优点 三、实现 Runnable 接口和实现 Call…

【python学习笔记】:Excel 数据的封装函数

对比其它编程语言&#xff0c;我们都知道Python最大的优势是代码简单&#xff0c;有丰富的第三方开源库供开发者使用。伴随着近几年数据分析的热度&#xff0c;Python也成为最受欢迎的编程语言之一。而对于数据的读取和存储&#xff0c;对于普通人来讲&#xff0c;除了数据库之…

程序员推荐的良心网站合集!(第二期)

今天来给大家推荐几个程序员必看的国外良心网站合集第二期合集。 Semantic Schoolar 由微软联合创始人Paul Allen开发的免费学术搜索引擎&#xff0c;不仅可以通过时间线快速定位想要的文献&#xff0c;还有强大的筛选功能可以精准的找到自己想要的文献&#xff0c;想要什么搜…

服务器部署

文章目录目录前言1、前端服务器选型1.1、Nginx1.1.1、Nginx介绍1.1.2、正向代理&反向代理1、正向代理2、反向代理1.1.3、优点1、支持高并发2、内存消耗少3、成本低廉4、配置文件非常简单5、支持Rewrite重写6、内置的健康检查功能7、节省带宽8、稳定性高9、支持热部署1.2、N…

[oeasy]python0098_个人计算机浪潮_IBM5100_微软成立_苹果II_VisCalc

个人计算机浪潮 回忆上次内容 个人电脑(PC) 在爱好者之间疯传 人人都有一台计算机 从attair-8800到apple-1个人电脑 离普通人 更近了 如果 人人都有 自己的电脑 谁还去 用终端连接大型机 呢&#xff1f; IBM真的被干掉了吗&#xff1f;&#x1f914; 时代背景 计算机 逐渐…

JVM 全面了解

JVM包含两个子系统和两个组件&#xff0c;两个子系统为Class loader(类装载器)、Execution engine(执行引擎)&#xff1b;两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 方法区&#xff1a;存储已被虚拟机加载的类元数据信息(元空间) 堆&#xf…

数据分析-深度学习 NLP Day3句法分析

第六章句法分析在本章中&#xff0c;你将学到与句法分析相关的一些算法和技术 。 很多技术手段可以用来实 现句法分析&#xff0c;包括基于规则的和基于统计的&#xff0c;在本章中读者将会了解其基本原理和使用方法 。本章要点主要如下&#xff1a;句法分析及其难点句法分析相…

高分子PEG,Biotin-PEG-amine,Biotin-PEG-NH2,生物素-聚乙二醇-氨基

Biotin-PEG-amine&#xff0c; Biotin-PEG-NH2 | 生物素-聚乙二醇-氨基 | CAS&#xff1a;N/A | 纯度&#xff1a;95%一、试剂信息&#xff1a;CAS号&#xff1a;N/A外观&#xff1a;固体/粉末分子量&#xff1a;1K、2K、5K、3.4K、10K、20K溶解性&#xff1a;溶于有机溶剂&…

WebRTC GCC拥塞控制算法详解

1、WebRTC版本m742、GCC的概念GCC全称Google Congest Control&#xff0c;所谓拥塞控制&#xff0c;就是控制数据发送的速率避免网络的拥塞。可以对比TCP的拥塞控制算法&#xff0c;由于WebRTC使用基于UDP的RTP来传输媒体数据&#xff0c;需要一个拥塞控制算法来保证基本的Qos。…

SLM27211 集成自举二极管的4A,120V高低边栅极驱动器

SLM27211是一款集成了自举二极管的120V的耐压的&#xff0c;支持高频率大电流&#xff08;4A&#xff09;输出的栅极驱动器。可以缩短栅极电压上升时间、下降时间。它可以在8V至20V下驱动高低MOSFET。产品以集新技术、新工艺、新成果为一体&#xff0c;可安全高效地应用于多类模…

【音视频安卓开发 (十一)】jni基础

要使用jni开发需要包含jni.h头文件JNIEXPORT JNI : 是一个关键字&#xff0c;不能少&#xff08;编译能通过&#xff09;&#xff0c;标记为该方法可以被外部调用jstring : 代表java中的stringJNICALL: 也是一个关键字&#xff0c;可以少的jni callJNIENV : 这是c和java相互调用…

学习笔记-架构的演进之服务容错策略设计模式-3月day02

文章目录前言断路器模式舱壁隔离模式重试模式总结附前言 容错设计模式&#xff0c;指的是“要实现某种容错策略&#xff0c;我们该如何去做”。微服务中常见的设计模式包括断路器模式、舱壁隔离模式和超时重试模式等&#xff0c;另外还有流量控制模式等。 断路器模式 断路器…

VSCode——SSH免密登录

文章目录本地PC端&#xff08;一般为Windows&#xff09;1. 检查自己是否已经生成公钥2. 配置VScode的SSH config远程服务器端1. 服务器新建授权文件2. 赋权限3. 重启远程服务器的ssh服务最全步骤&#xff1a;【设置ssh免密不起作用&#xff1f;彻底搞懂密钥】vscode在remote S…

linux常用命令介绍 05 篇——实际应用篇(用 cut、uniq等统计文档里每个关键词出现的次数)

linux常用命令介绍 05 篇——实际应用篇&#xff08;用 cut、uniq等统计文档里每个关键词出现的次数&#xff09;1. 先导文章——关于行过滤 和 列截取2. 关于单个统计单词个数2.1 grep2.2 wc3. 统计文档中每个关键词出现的次数3.1 先看文档内容 需求3.1.1 文档内容3.1.2 需求…

系列十、锁

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问…

热烈祝贺|济南市时代酒具盛装亮相2023中国(山东)精酿啤酒产业发展创新论坛暨展览会

济南市时代酒具制造股份有限公司成立于2010年&#xff0c;注册资金600万&#xff0c;员工100余人&#xff0c;占地30余亩&#xff0c;是山东省济南市一家专业的塑料产品生产厂家。主营酒塔、分酒器、混饮塔、果汁塔、橡木桶等系列酒具。经过十余年的发展&#xff0c;公司组建了…

201_DMA-BUF简单简介

一、DMA-BUF等概念的介绍 首先需要明确DMA-BUF&#xff0c;Dma buffer&#xff0c;ION和DMA-BUF Heap是不同的概念。 在Android 多媒体系统中为了减少因不同进程之间内存的多次拷贝而产生的不必要的开销&#xff0c;最直接的想法是希望跟硬件设备进行交互的应用能有一个内存能…

离线安装samba与配置(.tar方式安装)

一、samba离线安装【安装并设置成功后&#xff0c;相关文件及其位置&#xff1a;①smbd&#xff1a;/usr/local/samba/sbin/smbd②nmdb&#xff1a;/usr/local/samba/sbin/nmbd③配置文件 smb.conf&#xff1a;/usr/local/samba/lib/smb.conf④添加用户的 smbpasswd 文件&#…

Java并发简介(什么是并发)

文章目录并发概念并发和并行同步和异步阻塞和非阻塞进程和线程竞态条件和临界区管程并发的特点提升资源利用率程序响应更快并发的问题安全性问题缓存导致的可见性问题线程切换带来的原子性问题编译优化带来的有序性问题保证并发安全的思路互斥同步&#xff08;阻塞同步&#xf…