AcWing 154. 滑动窗口——算法基础课题解

AcWing 154. 滑动窗口

题目描述

给定一个大小为 n≤10^6 的数组。

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

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

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

以下是一个例子:

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

窗口位置最小值最大值
[1 3 -1] -3 5 3 6 7-13
1 [3 -1 -3] 5 3 6 7-33
1 3 [-1 -3 5] 3 6 7-35
1 3 -1 [-3 5 3] 6 7-35
1 3 -1 -3 [5 3 6] 736
1 3 -1 -3 5 [3 6 7]37

你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。

输入格式

输入包含两行。

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

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

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

输出格式

输出包含两个。

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

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

输入样例

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

输出样例

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

C++

#include <iostream>using namespace std;const int MAX_SIZE = 1000010;int nums[MAX_SIZE], deque[MAX_SIZE]; // 定义两个数组,一个存储输入的数值,一个作为双端队列int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int n, k;cin >> n >> k;for (int i = 0; i < n; i++) cin >> nums[i];int head = 0, tail = -1; // 初始化双端队列的头尾指针// 计算滑动窗口最小值for (int i = 0; i < n; i++) {// 移除超出窗口范围的元素if (head <= tail && i - k + 1 > deque[head]) head++;// 移除队列中比当前元素大的元素,保证队列递增while (head <= tail && nums[deque[tail]] >= nums[i]) tail--;deque[++tail] = i; // 将当前元素索引加入队列// 输出当前窗口的最小值if (i >= k - 1) cout << nums[deque[head]] << " ";}cout << endl;head = 0, tail = -1; // 重新初始化头尾指针// 计算滑动窗口最大值for (int i = 0; i < n; i++) {// 移除超出窗口范围的元素if (head <= tail && i - k + 1 > deque[head]) head++;// 移除队列中比当前元素小的元素,保证队列递减while (head <= tail && nums[deque[tail]] <= nums[i]) tail--;deque[++tail] = i; // 将当前元素索引加入队列// 输出当前窗口的最大值if (i >= k - 1) cout << nums[deque[head]] << " ";}return 0;
}

Go

package mainimport ("bufio""fmt""os"
)func main() {reader := bufio.NewReader(os.Stdin)writer := bufio.NewWriter(os.Stdout)defer writer.Flush()var n, k intfmt.Fscanf(reader, "%d %d\n", &n, &k)nums := make([]int, n)for i := 0; i < n; i++ {fmt.Fscanf(reader, "%d ", &nums[i])}deque := make([]int, n)head := 0tail := -1for i := 0; i < n; i++ {if head <= tail && deque[head] < i-k+1 {head++}for head <= tail && nums[deque[tail]] >= nums[i] {tail--}tail++deque[tail] = iif i >= k-1 {fmt.Fprintf(writer, "%d ", nums[deque[head]])}}fmt.Fprintln(writer)head = 0tail = -1for i := 0; i < n; i++ {if head <= tail && deque[head] < i-k+1 {head++}for head <= tail && nums[deque[tail]] <= nums[i] {tail--}tail++deque[tail] = iif i >= k-1 {fmt.Fprintf(writer, "%d ", nums[deque[head]])}}
}
package mainimport ("bufio""fmt""os"
)var reader = bufio.NewReader(os.Stdin)
var writer = bufio.NewWriter(os.Stdout)func maxSlidingWindow(nums []int, k int) {var q []int // 使用一个队列q来存储元素的索引// 定义一个局部函数push,它的功能是向队列中添加元素push := func(i int) {// 如果队列不为空,且当前元素值大于等于队列尾部元素值for len(q) > 0 && nums[i] >= nums[q[len(q)-1]] {// 队列尾部元素出队q = q[:len(q)-1]}// 将当前元素的索引入队q = append(q, i)}// 先将前k个元素做处理for i := 0; i < k; i++ {push(i)}n := len(nums)fmt.Fprintf(writer, "%d ", nums[q[0]])// 从k开始遍历,对于每个元素,都将其添加到队列中// 并保证队列的头部元素总是当前窗口的最大值for i := k; i < n; i++ {push(i)// 如果队列中的头部元素不在当前窗口中,就将其出队for q[0] <= i-k {q = q[1:]}fmt.Fprintf(writer, "%d ", nums[q[0]])}}func minSlidingWindow(nums []int, k int) {var q []intpush := func(i int) {for len(q) > 0 && nums[i] <= nums[q[len(q)-1]] {q = q[:len(q)-1]}q = append(q, i)}for i := 0; i < k; i++ {push(i)}n := len(nums)fmt.Fprintf(writer, "%d ", nums[q[0]])for i := k; i < n; i++ {push(i)for q[0] <= i-k {q = q[1:]}fmt.Fprintf(writer, "%d ", nums[q[0]])}
}func main() {defer writer.Flush()var n, k intfmt.Fscanf(reader, "%d %d\n", &n, &k)nums := make([]int, n)for i := 0; i < n; i++ {fmt.Fscanf(reader, "%d ", &nums[i])}minSlidingWindow(nums, k)fmt.Fprintln(writer)maxSlidingWindow(nums, k)
}

模板

常见模型:找出滑动窗口中的最大值/最小值
int hh = 0, tt = -1;
for (int i = 0; i < n; i ++ )
{while (hh <= tt && check_out(q[hh])) hh ++ ;  // 判断队头是否滑出窗口while (hh <= tt && check(q[tt], i)) tt -- ;q[ ++ tt] = i;
}

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

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

相关文章

运用HTML、CSS设计Web网页——“西式甜品网”图例及代码

目录 一、效果展示图 二、设计分析 1.整体效果分析 2.头部header模块效果分析 3.导航及banner模块效果分析 4.分类classify模块效果分析 5.产品展示show模块效果分析 6.版权banquan模块效果分析 三、HTML、CSS代码分模块展示 1. 头部header模块代码 2.导航及bann…

【SpringCloud】Spring Cloud基本介绍

目录 回顾架构分类单体架构分布式架构微服务架构什么是微服务优点缺点微服务的架构特征&#xff1a;微服务架构面临的挑战技术挑战微服架构的设计原则微服务概念提供者(Provider)消费者(Consumer)RPC和Restful集群分布式 总结 服务拆分和远程调用服务拆分原则服务拆分示例 思考…

docker和docker-compose安装

1.安装docker 安装所需的软件包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2#设置阿里源 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo更新软件包索引 sudo yum makecache fast查询可安装…

力扣爆刷第143天之二叉树五连刷(二叉搜索树)

力扣爆刷第143天之二叉树五连刷&#xff08;二叉搜索树&#xff09; 文章目录 力扣爆刷第143天之二叉树五连刷&#xff08;二叉搜索树&#xff09;一、530. 二叉搜索树的最小绝对差二、501. 二叉搜索树中的众数三、236. 二叉树的最近公共祖先四、235. 二叉搜索树的最近公共祖先…

http项目改为/支持https的方案、无需修改后台代码

背景描述&#xff1a;原来的项目前后台都是http&#xff0c;现在某个服务要求前台必须使用https&#xff1b; 方案1&#xff1a;前台部署在https里&#xff0c;后面代码修改&#xff1b;但是微服务架构&#xff0c;后台工作量太大&#xff1b; 方案2&#xff1a;前台部署在ht…

Pytorch-08 实战:手写数字识别

手写数字识别项目在机器学习中经常被用作入门练习&#xff0c;因为它相对简单&#xff0c;但又涵盖了许多基本的概念。这个项目可以视为机器学习中的 “Hello World”&#xff0c;因为它涉及到数据收集、特征提取、模型选择、训练和评估等机器学习中的基本步骤&#xff0c;所以…

vue 打印、自定义打印、页面打印、隐藏页眉页脚

花了一天时间搞了个打印功能&#xff0c;现则将整体实现过程进行整理分享。先来看看效果图&#xff1a; 1、页面展示为&#xff1a; 2、重组页面打印格式为&#xff1a;这里重组页面的原因是客户要求为一行两列打印 &#xff01;内容过于多的行则独占一行显示完整。 整体实现&…

区块链论文总结速读--CCF A会议 USENIX Security 2024 共7篇 附pdf下载

Conference&#xff1a;33rd USENIX Security Symposium CCF level&#xff1a;CCF A Categories&#xff1a;网络与信息安全 Year&#xff1a;2024 Num&#xff1a;7 1 Title: Practical Security Analysis of Zero-Knowledge Proof Circuits 零知识证明电路的实用安全…

hbase版本从1.2升级到2.1 spark读取hive数据写入hbase 批量写入类不存在问题

在hbase1.2版本中&#xff0c;pom.xml中引入hbase-server1.2…0和hbase-client1.2.0就已经可以有如下图的类。但是在hbase2.1.0版本中增加这两个不行。hbase-server2.1.0中没有mapred包&#xff0c;同时mapreduce下就2个类。版本已经不支持。 <dependency><groupId>…

安全访问python字典:避免空键错误的艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、直接访问字典键的问题 三、使用get方法安全访问字典键 四、get方法的实际应…

Could not create connection to database server的错误原因

1、使用MyBatis 连接数据库报错 org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. ### The error may …

流量卡激活先交100块钱,这个确定不是套路吗?

很多第一次申请流量卡的时候&#xff0c;在激活的时候都会问的一个问题&#xff0c;为什么激活时都要先交100块钱&#xff0c;这个确定不是套路吗 ​  先说一下&#xff0c;首充其实并不是商家的要求&#xff0c;准确来说是运营商的要求&#xff0c;目前运营商推出的线上流量…

用队列实现栈,用栈实现队列

有两个地方会讨论到栈&#xff0c;一个是程序运行的栈空间&#xff0c;一个是数据结构中的栈&#xff0c;本文中讨论的是后者。 栈是一个先入后出&#xff0c;后入先出的数据结构&#xff0c;只能操作栈顶。栈有两个操作&#xff0c;push 和 pop&#xff0c;push 是向将数据压…

电脑如何远程监控?如何远程监控电脑屏幕?

远程监控是指通过网络技术和远程视频传输技术&#xff0c;实现对某一特定区域、设备或场景进行远程实时监测、管理、控制的一种技术手段。 它将视频传输、图像采集、数据存储和远程操作等多种技术相结合&#xff0c;能够在任意时间、任意地点实现对被监测对象的远程监控。 远程…

在Windows系统服务器上安装Node.js的步骤

在windows操作系统中&#xff0c;可以使用命令行&#xff08;CMD&#xff09;安装Node.js。 【第一步】下载Node.js安装包 在官网https://nodejs.cn/download下载安装包&#xff0c;以 64位 Windows 安装包为例。 【第二步】将Node.js安装包上传到服务器 将安装包上传到指定…

基于Docker Compose部署One-API的详细指南

部署One-API的详细指南 前言 one-api是一个开源项目(https://github.com/songquanpeng/one-api)&#xff0c;旨在简化API的开发与管理过程。这个项目提供了一个全面的解决方案&#xff0c;特别适用于需要高效管理API接口的开发者和团队。以下是该项目的一些核心特点和功能&am…

IO模型:同步阻塞、同步非阻塞、同步多路复用、异步非阻塞

目录 stream和channel对比 同步、异步、阻塞、非阻塞 线程读取数据的过程 同步阻塞IO 同步非阻塞IO 同步IO多路复用 异步IO 优缺点对比 stream和channel对比 stream不会自动缓冲数据&#xff0c;channel会利用系统提供的发送缓冲区、接收缓冲区。stream仅支持阻塞API&am…

轻松拿捏C语言——【字符函数】字符分类函数、字符转换函数

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; &#x1f339;如有问题&#xff0c;欢迎指正 感谢 目录&#x1f451; 一、字符分类函数&#x1f319; 二、字符转换函数…

hive3从入门到精通(二)

第15章:Hive SQL Join连接操作 15-1.Hive Join语法规则 join分类 在Hive中&#xff0c;当下版本3.1.2总共支持6种join语法。分别是&#xff1a; inner join&#xff08;内连接&#xff09;left join&#xff08;左连接&#xff09;right join&#xff08;右连接&#xff09;…