滑动窗口(全面清晰/Java)

这篇具有很好参考价值的文章主要介绍了滑动窗口(全面清晰/Java)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

不清楚蓝桥杯考什么的点点下方👇

考点秘籍

想背纯享模版的伙伴们点点下方👇

蓝桥杯省一你一定不能错过的模板大全(第一期)

蓝桥杯省一你一定不能错过的模板大全(第二期)

蓝桥杯省一你一定不能错过的模板大全(第三期)

蓝桥杯省一你一定不能错过的模板大全(第四期)!!!

想背注释模版的伙伴们点点下方👇

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

蓝桥杯上岸每日N题 第一期(一)!!!

蓝桥杯上岸每日N题第一期(二)!!!

蓝桥杯上岸每日N题第一期(三)!!!

蓝桥杯上岸每日N题第二期(一)!!!

蓝桥杯上岸每日N题第三期(一)!!!

蓝桥杯上岸每日N题 第四期(最少刷题数)!!!

蓝桥杯上岸每日N题 第五期(山)!!!

蓝桥杯上岸每日N题 第六期(求阶乘)!!!

蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

蓝桥杯上岸每日N题 第八期 (全球变暖)!!!

操作系统期末题库 第九期(完结)

LeetCode Hot100 刷题(第三期)

idea创建SpringBoot项目报错解决方案

数据库SQL语句(期末冲刺)

想看JavaB组填空题的伙伴们点点下方 👇

填空题

竞赛干货

算法竞赛字符串常用操作大全

蓝桥杯上岸必刷!!!(模拟/枚举专题)

蓝桥杯上岸必背!!! (第三期 DP)

蓝桥杯上岸必背!!!(第四期DFS)

蓝桥杯上岸必背!!!(第五期BFS)

蓝桥杯上岸必背!!!(第六期树与图的遍历)

蓝桥杯上岸必背!!!(第七期 最短路算法)

蓝桥杯上岸必背!!!(第八期 简单数论)

蓝桥杯上岸必刷!!!(进制、数位专题)

蓝桥杯上岸考点清单 (冲刺版)!!!

数组模拟单调队列

分析

以k=3举例:

(1)利用单调队列的性质:
<1>最小值:确保队列单调递增,处理后,队头即是最小值。
<2>最大值:确保队列单调递减,处理后,队头即是最大值。
那么怎么确保单调性?

关键代码:
以最小值为例:
while(hh<=tt&&a[q[tt]]>=a[i])tt--;

(2)这里的a[q[tt]]>=a[i]即是确保单调性的关键!
(求最大值这里修改成a[q[tt]]<=a[i],确保单调递减即可,其余均一致。)

解读:每次添加元素到队尾后,将该队尾元素和队头元素进行比较,如果这个元素大于(等于)队头元素,就说明队尾元素并不是需要的最小值,队头元素比它更适合,更有潜力成为最小值,所以将该队尾元素抹掉,则t- -。再继续添加,继续判断。

换句话来说,不满足单调递增的性质,需要将不满足的元素给剔掉,确保单调性。

确保单调性后,为什么输出队头即可?
确保单调性后,我们得到的队尾元素即是最小/大值,此时,如果只有一个元素,即队头,输出队头即可。
如果还有剩余元素,需要将队列中剩余的其他元素剔掉,让队列中只有一个元素,此时,队头指向队尾,输出队头即可。
综上,输出队头即可。

那又怎么剔掉单调处理后,队列中还有多余的元素(出队多余元素)?
关键代码:
以最小值为例:
if(hh<=tt&&i-k+1>q[hh])hh++;

(3)这里的i-k+1即是确保出队的关键!
推断如下:
滑动窗口(全面清晰/Java),蓝桥杯上岸,java,滑动窗口,蓝桥杯,算法,数据结构,eclipse,leetcode

这里的出队有两层意义:

<1>用于更新原队列的hh,一个个出掉,范围更新下去。
<2>用于队头元素的出队,如果tt- -后,队列中只有1个元素,即队头,输出即可。
如果队列中还剩1、2个元素,则需要出队,不断出掉队尾元素前的元素,即hh++;

(4)最后,由单调性的确保和队头元素的确保,只需要输出队头元素即可。

队列过程变化图

图1

滑动窗口(全面清晰/Java),蓝桥杯上岸,java,滑动窗口,蓝桥杯,算法,数据结构,eclipse,leetcode

图2

滑动窗口(全面清晰/Java),蓝桥杯上岸,java,滑动窗口,蓝桥杯,算法,数据结构,eclipse,leetcode文章来源地址https://www.toymoban.com/news/detail-634914.html

代码

import java.util.*;
import java.io.*;
public class Main{
	static int N=100010;
	static int n,k;
	static int hh,tt;
	static int q[]=new int [N];
	static int a[]=new int [N];
	
    public static void main(String []args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        String []st = in.readLine().split(" ");
        n=Integer.parseInt(st[0]);
        k=Integer.parseInt(st[1]);
        String []str = in.readLine().split(" ");
     for(int i=0;i<n;i++){
         a[i]=Integer.parseInt(str[i]);
     }
     
     hh = 0;
     tt=-1;
     //求最小值
     for(int i=0;i<n;i++){
        //出队
        if(hh<=tt&&i-k+1>q[hh])hh++;//出队
        //t--更新到最后,如果还剩1-2个元素,则把他们都剔掉。
        //此时,队头指向队尾,再输出队头即可。
        
        while(hh<=tt&&a[q[tt]]>=a[i])tt--;//保证队列单调递增,那么队尾即是最小值。
    //具体为添加进队尾的元素如果比队头的元素要大,就tt--,即把该元素给剔掉。
        
        q[++tt]=i;//添加元素下标到队列尾
        
        if(i>=k-1)//在k的范围队列中,输出元素
        out.print(a[q[hh]]+" ");
     }
     out.println();
     
    //求最大值
    hh=0;
    tt=-1;
     for(int i=0;i<n;i++){
        //出队
        if(hh<=tt&&i-k+1>q[hh])hh++;
   //t--更新到最后,如果还剩1-2个元素,则把他们都剔掉。
  //此时,队头指向队尾,再输出队头即可。
        
        while(hh<=tt&&a[q[tt]]<=a[i])tt--;//保证队列单调递减,那么队尾即是最大值。
  //具体为添加进队尾的元素如果比队头的元素要小,就tt--,即把该元素给剔掉。
         
        q[++tt]=i;//添加元素下标到队列尾
        
        if(i>=k-1)//在k的范围队列中,输出元素
        out.print(a[q[hh]]+" ");
    }
    out.flush();
}
}

到了这里,关于滑动窗口(全面清晰/Java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【剑指offer刷题记录 java版】数组双指针 之 滑动窗口

    本系列文章记录labuladong的算法小抄中剑指offer题目 题目链接:https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ 题目链接:https://leetcode.cn/problems/MPnaiL/ 题目链接:https://leetcode.cn/problems/VabMRr/ 题目链接:https://leetcode.cn/problems/wtcaE1/ 题目链接:https://leetcode.cn/pr

    2024年02月09日
    浏览(51)
  • Java【手撕滑动窗口】LeetCode 209. “长度最小子数组“, 图文详解思路分析 + 代码

    各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等 📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议

    2024年02月11日
    浏览(44)
  • 【免费题库】华为OD机试 - 滑动窗口最大和(Java & JS & Python & C & C++)

    哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止, 每次窗口滑动产生一个窗口和(窗口内所有数的和),求窗口滑动产生的所

    2024年04月10日
    浏览(45)
  • Java【手撕滑动窗口】LeetCode 438. “字符串中所有异位词“, 图文详解思路分析 + 代码

    各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等 📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议

    2024年02月10日
    浏览(43)
  • Java【手撕滑动窗口】LeetCode 3. “无重复字符的最长子串“, 图文详解思路分析 + 代码

    各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等 📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议

    2024年02月11日
    浏览(40)
  • 【华为OD机试真题 C++ Java Python】1、滑动窗口最大值 | 机试真题+思路参考+代码解析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏每篇的文章都会将使用C++、Python、Java三种语言进行更新解答,每个题目的思路分析都非常详细,超过百字欢迎大家订阅学习,代码可以直接运行使用 🎃题目描述 有一个

    2024年02月08日
    浏览(46)
  • 【算法】基础算法002之滑动窗口(二)

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》 《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言  5.水果成篮(medium)  6.找到字符串中所有字母异位词 7.串联所有单词的

    2024年02月20日
    浏览(49)
  • LeetCode算法小抄--滑动窗口算法

    ⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计6244字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀文末我的个人微信公众号:不懂开发的程序猿 个人网站:https://jerry-jy.co/ 滑动窗口算法 思路 1、我们在字符串 S 中使用双指针中的

    2023年04月09日
    浏览(40)
  • 【算法】基础算法002之滑动窗口(一)

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.长度最小的子数组 滑动窗口类问题解题思路大纲: 2.无重复字符的最长

    2024年02月19日
    浏览(46)
  • 滑动窗口算法

    目录 滑动窗口算法 基本思想  可解决问题 应用 题目一:最小覆盖子串 题目解读:  代码 题目二:长度最小的子数组 题目解读 代码 滑动算法窗口的优缺点 优点: 缺点: 首先介绍一下什么是滑动窗口:滑动窗口算法是一种在数组或字符串中寻找特定模式的算法,它可以在

    2024年02月03日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包