首页 > 编程语言 >算法基础 数据结构

算法基础 数据结构

时间:2022-11-23 09:47:38浏览次数:43  
标签:输出 窗口 int 基础 队列 算法 数组 滑动 数据结构

单调队列

概念

单调队列

题目

154. 滑动窗口

题目描述

给定一个大小为 n≤106 的数组。

有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。

你只能在窗口中看到 k 个数字。

每次滑动窗口向右移动一个位置。

以下是一个例子:

该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。

窗口位置 最小值 最大值
[1 3 -1] -3 5 3 6 7 -1 3
1 [3 -1 -3] 5 3 6 7 -3 3
1 3 [-1 -3 5] 3 6 7 -3 5
1 3 -1 [-3 5 3] 6 7 -3 5
1 3 -1 -3 [5 3 6] 7 3 6
1 3 -1 -3 5 [3 6 7] 3 7
你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。

输入格式
输入包含两行。

第一行包含两个整数 n 和 k,分别代表数组长度和滑动窗口的长度。

第二行有 n 个整数,代表数组的具体数值。

同行数据之间用空格隔开。

输出格式
输出包含两个。

第一行输出,从左至右,每个位置滑动窗口中的最小值。

第二行输出,从左至右,每个位置滑动窗口中的最大值。

输入样例:
8 3
1 3 -1 -3 5 3 6 7
输出样例:
-1 -3 -3 -3 3 3
3 3 5 5 6 7

代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a[N],q[N];
int main(){
    ios::sync_with_stdio(false);
    int n,k;cin>>n>>k;
    for(int i=0;i<n;++i)cin>>a[i];
    int hh=0,tt=-1;
    //第一遍输出最小元素,由于每次滑动新加入的元素前面只允许存在比他还小的元素,所以维护的是一个单调递增的队列
    for(int i=0;i<n;++i){//i为窗口尾指针
        if(hh<=tt&&q[hh]<i-k+1)hh++;//如果单调队列非空,且队头已经出了滑动窗口,要将它删掉
        while(hh<=tt&&a[q[tt]]>=a[i])tt--;//如果单调队列非空,且队尾对应的值大于新加入的值,要将原来的队尾删除
        q[++tt]=i;//新元素入队
        if(i>=0+k-1)cout<<a[q[hh]]<<" ";//当滑动窗口成型后每次都要输出当前最小值
    }
    hh=0,tt=-1;cout<<endl;
    for(int i=0;i<n;++i){
        if(hh<=tt&&q[hh]<i-k+1)hh++;
        while(hh<=tt&&a[q[tt]]<=a[i])tt--;
        q[++tt]=i;
        if(i>=0+k-1)cout<<a[q[hh]]<<" ";
    }
    return 0;
}

标签:输出,窗口,int,基础,队列,算法,数组,滑动,数据结构
From: https://www.cnblogs.com/m2364532/p/16917253.html

相关文章

  • 基础2-容器
    1、列表(list):是以固定顺序保存对象的容器;列表用方括号表示。列表中可以保存任意类型的数据;我们可以用2中语法创建列表:1)利用list函数创建列表: fruit=list()2)利用方括号创......
  • 运维基础知识
    Linux常用命令&操作NoItemDesc1lombok正确引入姿势lombok引入及失效问题处理2如何安装TalendAPITesterTalendAPITester安装&使用笔记3......
  • 高级数据结构
    一、线段树二、树状数组原理我们通过观察这张图可以发现如下性质:后缀和的长度是\(2\)的幂。上一层后缀和的长度是下一层的\(2\)倍。下面一层只要补上自己的后......
  • GCD算法
    以下是记录的一些笔记:有些混乱,寒假再来细细整理。   python实现:defgcd(a,b):while(b!=0):r=a%ba,b=b,rreturnaprint(gc......
  • 代码随想录算法训练营第七天 | 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ●
    今日任务●454.四数相加II●383.赎金信●15.三数之和●18.四数之和●总结详细布置454.四数相加II建议:本题是使用map巧妙解决的问题,好好体......
  • 计算机视觉基础~图像预处理(上)
    图像预处理内容提要:图像显示与存储原理图像增强的目标点运算:基于直方图的对比度增强 形态学处理空间域处理:卷积卷积的应用(平滑、边缘检测、锐化等)频率域处理:傅里叶变换、......
  • ELK基础介绍
    前戏:运维人员需要对系统和业务日志进行精准把控,便于分析系统和业务状态。日志分布在不同的服务器上,传统的使用传统的方法依次登录每台服务器查看日志,既繁琐又效率低下。所以......
  • 代码随想录算法训练营Day07|454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数
    代码随想录算法训练营Day07|454.四数相加II、383.赎金信、15.三数之和、18.四数之和454.四数相加II题目链接:454.四数相加II题干交代四个数组的长度相等,所以我......
  • Grafana+OpenSearch+Spring Boot集成(一) 【基础环境配置】
    先决条件1、环境Windows,内存最好在8GB以上已安装DockerDesktop(下载地址:https://www.docker.com/products/docker-desktop/)2、知识准备了解如何使用Docker了解Op......
  • elasticSearch基础(一)
    es的一些概念索引:相同类型的文档的集合,相当于MySQL的表的概念文档:es是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为jso......