当前位置: 首页 > news >正文

题解:AcWing 154 滑动窗口

【题目来源】

AcWing:154. 滑动窗口 - AcWing题库

【题目描述】

给定一个大小为 \(n\le 10^6\) 的数组。

有一个大小为 \(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

【解题思路】

image

【算法标签】

《AcWing 154 滑动窗口》 #单调队列#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 1000010;  // 定义数组最大长度
int n, k;              // n: 数组长度, k: 滑动窗口大小
int a[N], q[N];        // a: 输入数组, q: 单调队列(存储下标)int main()
{// 输入数组长度和窗口大小scanf("%d%d", &n, &k);// 输入数组元素for (int i = 0; i < n; i++) scanf("%d", &a[i]);// 计算滑动窗口最小值int hh = 0, tt = -1;  // 队列头尾指针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 >= k - 1) printf("%d ", a[q[hh]]);}puts("");  // 换行// 计算滑动窗口最大值(与最小值类似)hh = 0, tt = -1;  // 重置队列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 >= k - 1) printf("%d ", a[q[hh]]);}puts("");  // 换行return 0;
}

【运行结果】

8 3
1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3 
3 3 5 5 6 7 
http://www.jsqmd.com/news/399270/

相关文章:

  • 与相似的灵魂为邻——一位文化从业者的圈层选择
  • 题解:AcWing 3302 表达式求值
  • CST仿真:探索涡旋与聚焦的奇妙世界
  • 678678678
  • SaaS架构下AI原生应用的最佳实践与案例分析
  • 题解:P15369 『ICerOI Round 1』并非图论
  • 题解:AcWing 828 模拟栈
  • 深度解析AI原生应用领域的事件驱动机制
  • 大数据ETL处理:GPU加速方案设计与性能优化
  • C语言中的数据类型和变量
  • 题解:AcWing 827 双链表
  • 题解:AcWing 826 单链表
  • 题解:AcWing 802 区间和
  • js获取html相邻标签
  • 题解:AcWing 803 区间合并
  • 计算机毕业设计 | SpringBoot+vue科研项目验收管理系统(附源码+论文)
  • 计算机毕业设计 | SpringBoot+vue毕业论文管理系统 高校文档项目答辩平台(附源码+论文)
  • 计算机毕业设计 | SpringBoot+vue中山社区医疗综合服务平台(附源码+论文)
  • Flink 任务失败恢复机制Restart Strategy 和 Failover Strategy 怎么配才“又稳又不炸”
  • Tauri 前端配置把任何前端框架“正确地”接进 Tauri(含 Vite/Next/Nuxt/Qwik/SvelteKit/Leptos/Trunk)
  • 计算机毕业设计 | SpringBoot+vue毕业设计答辩平台 校园成绩管理系统(附源码+论文)
  • Tauri 项目结构前端壳 + Rust 内核,怎么协作、怎么构建、怎么扩展
  • 抖音评论自动采集|拓客|免登录
  • 当Claude Code负责人说amp;quot;编程已解决amp;quot;,测试工程师该慌吗?
  • Claude Code 安装教程(macOS / Linux / Windows PowerShell 一键脚本)【2026 最新】
  • 题解:AcWing 801 二进制中1的个数
  • 寒假第二十天
  • 一文彻底搞懂强化学习
  • js XMLHttpRequest编程误区(复用这个对象导致的冲突问题)
  • 当Claude Code负责人说编程已解决,测试工程师该慌吗?