Acwing---154. 滑动窗口

2024-02-05 15:04
文章标签 窗口 acwing 滑动 154

本文主要是介绍Acwing---154. 滑动窗口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

滑动窗口

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

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

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

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

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

以下是一个例子:

该数组为 [1 3 -1 -3 5 3 6 7] k k k 3 3 3
在这里插入图片描述
你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。

输入格式
输入包含两行。

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

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

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

输出格式
输出包含两个。

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

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

输入样例:

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

输出样例:

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

2.基本思想

使用单调递减队列来保存滑动窗口中的元素,下标越大的元素越接近队尾,下标越小的元素越接近队头,于是求滑动窗口中的最小值相当于访问队头元素。

不妨设下标从 0 开始,初始时 i 指向 0 ,并且 i 从 0 遍历至 n-1 ,每次遍历都将 a [ i ] 插入到队列中。可以发现,只要有 i+1 < k就说明滑动窗口还未形成,此时无需输出最小值,当 i+1 ≥ k 时才需要输出最小值。

那何时弹出队头元素呢?不妨让单调队列保存的是元素的下标而非元素本身,设当前窗口为 a [ i−k … i−1 ],向单调队列插入 i 后,新窗口变成 a [ i−k+1 … i ] ,如果队头元素小于 i − k+1 ,说明最小值不在新窗口中,此时应当弹出队头元素。

  • 只要 i ≥ k 就应当输出队头元素;
  • 当队头元素小于等于 i − k 时,弹出队头元素。
  • 在这里插入图片描述
    参考——模拟视频

3.代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class _154滑动窗口 {static int N = 1000010;static int[] a = new int[N], q = new int[N];//q队列存下标static int hh, tt = -1;//队头  队尾 指针public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] s = br.readLine().split(" ");int n = Integer.parseInt(s[0]), k = Integer.parseInt(s[1]);String[] s1 = br.readLine().split(" ");for (int i = 0; i < n; i++) a[i] = Integer.parseInt(s1[i]);//查找最小值for (int i = 0; i < n; i++) {//枚举序列while (hh <= tt && a[q[tt]] >= a[i]) tt--;//队尾出队(队列不空 且新元素 更优)q[++tt] = i;//队尾入队 (存储下标 方便判断队头出队)if (q[hh] < (i - k + 1)) hh++;//对头出队 (队头元素滑出 窗口)if (i >= k-1) System.out.print(a[q[hh]] + " ");}System.out.println();hh = 0;tt = -1;//查找最大值for (int i = 0; i < n; i++) {//枚举序列while (hh <= tt && a[q[tt]] <= a[i]) tt--;//队尾出队(队列不空 且新元素 更优)q[++tt] = i;//队尾入队 (存储下标 方便判断队头出队)if (q[hh] < (i - k + 1)) hh++;//对头出队 (队头元素滑出 窗口)if (i >= k-1) System.out.print(a[q[hh]] + " ");}}
}

这篇关于Acwing---154. 滑动窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/681286

相关文章

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig

【AcWing】851. 求最短路

spfa算法其实是对贝尔曼福特算法做一个优化。 贝尔曼福特算法会遍历所有边来更新,但是每一次迭代的话我不一定每条边都会更新,SPFA是对这个做优化。 如果说dist[b]在当前这次迭代想变小的话,那么一定是dist[a]变小了,只有a变小了,a的后继(b)才会变小。 用宽搜来做优化,用一个队列,队列里边存的就是所有变小了的结点(队列里存的是待更新的点)。 基本思路就是我更新过谁,我再拿

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis