滑动窗口 (双端队列实现)

JavaScript中的滑动窗口与双端队列应用实战 滑动窗口算法是一种高效的编程技术,广泛应用于数组或字符串的子区间问题解决中。它通过维护一个动态大小的窗口来处理问题,这个窗口可以在数组或字符串上左右滑动,并在滑动过程中更新数据以达到快速解决问题的目的。双端队列是一种允许在两端进行插入和删除操作的线性数据结构。与标准的队列和栈相比,双端队列具有更多的灵活性。它可以作为队列(FIFO)使用,也可以作为栈(LIFO)使用,或者以其他方式操作元素。 阅读详情

滑动窗口: 使用双端队列实现,双端队列的作用是保证每次L边界右移时从队列头弹出的都是当前窗口的最大值. 队列中存储元素下标即可,因为对于数组结构有索引什么都可以搞定!

操作:

  1. 给定一个限制为k的窗口大小 ,L,R分别代表窗口左右边界,L和R只能向右移动,当R触碰到数组长度极限时结束.                                                                                                                      
  2. L和R初始为index 0,R先移动,当R - L == K 时说明此时的窗口已来到规定的窗口大小,那么之后L和R同步移动,L和R的每次同步移动都会导致当前窗口内最大值的变化                           
  3. 为了能在L和R同步移动时知道此时窗口内的最大值,在开始遍历时,如果队列为空,直接放入队尾,如果不为空,比对要存入的值与队列尾部的值,如果队尾的值小于或者等于,那就一直弹出,直到遇到比要插入值大的停,然后插入                                                                                       
  4. 当左边界L移动时,就会导致有一个元素被移出窗口,队列也应该有具体的变化.如果L当前的值与队列头比对,如果索引相同那就不操作,如果相同,就从队列头弹出(队列变化的目的就是为了保证当前窗口中的最大值位于队列头部)

        注: 本例实现的是一个固定大小的滑动窗口模型! 如果想实现大小不固定的滑动窗口可以实时改变L和R,即L和R的变化手工控制即可

/**
 * 完整的滑动窗口
 *      例如: {4, 3, 5, 4, 3, 3, 6, 7} 窗口中最大值:{5, 5, 4, 6, 7}
 *      例如: {14, 33, 15, 4, 23, 37, 6, 17} 窗口中最大值:{33, 33, 23, 37, 37, 37}
 */
public class FullSlideWindow {
    public static void main(String[] args) {
        int[] arr = {14, 33, 15, 4, 23, 37, 6, 17};
        slideWin(arr,0,0,3); // 数组,L,R为边界,3为窗口上限
    }

    public static void slideWin(int[] arr,int l,int r,int k){
        Deque<Integer> deque = new LinkedList<>();
        while (r < arr.length){
            if((r - l) == k){
                if(l == 0 && !deque.isEmpty()){
                    System.out.print(arr[deque.peek()] + " ");
                }
                slideLimit(deque,arr,r);
                if(!deque.isEmpty()){
                    System.out.print(arr[deque.peek()] + " ");
                }
                l ++;
                if(!deque.isEmpty()){
                    if(l == deque.peekFirst()){
                        deque.pollFirst();
                    }
                }
            }else{
                slideLimit(deque,arr,r);
            }
            r ++;
        }
    }

    public static void slideLimit(Deque<Integer> deque, int[] arr, int r){
        if (!deque.isEmpty()) {
            while (!deque.isEmpty()) {
                if(arr[deque.peekLast()] <= arr[r]){
                    deque.pollLast();
                }else{
                    deque.addLast(r);
                    break;
                }
            }
            if(deque.isEmpty()){
                deque.addLast(r);
            }
        }else{
            deque.addLast(r);
        }
    }
}

 左神算法学习

八股已死、场景当立(Docker篇) 本文总结了Docker相关的面试八股文,重点介绍了Docker在Java开发中的应用。主要内容包括:Docker容器与虚拟机的区别及其对Java应用性能的影响;如何为Java应用构建优化镜像;Docker常用命令在Java容器管理中的使用;Docker网络模式与数据卷在Java微服务中的配置;使用Docker Compose部署Java+MySQL微服务的方法;以及为Java应用配置健康检查的重要性。文章还通过具体示例说明了Nginx容器挂载、日志收集等常见场景的实现方式,为Java开发者提供了实用的Doc 阅读详情

相关推荐

Geant4 学习笔记(一):实现multi-thread多线程

简单修改实现Geant4多线程

weixin_52417815的博客 6084

滑动窗口算法的基本思想、应用场景、实现方法、时间复杂度和常见问题

滑动窗口算法(Sliding Window)是一种常用的双指针算法,被广泛应用于字符串和数组等数据结构中的子串或子数组问题,例如字符串匹配、最长子串、最小覆盖子串等问题。滑动窗口算法可以优化暴力枚举的时间复杂度,使得算法的执行效率更高。本文将详细介绍滑动窗口算法的基本思想、应用场景、实现方法、时间复杂度和常见问题等相关内容。滑动窗口算法是一种常用的双指针算法,能够优化字符串和数组问题的时间复杂度,被广泛应用于各种子串或子数组问题的求解。

网络技术联盟站 3303

CTF入门RSA维纳攻击

RSA维纳攻击 一.题目描述 适用于e过大或国过小情况下的RSA加密 题干如下: #coding:utf-8 import gmpy2 import libnum e = 54856417509806712596137531985117125938559627187663765776152288580865785539464797248184444737659643755765127505761012086539564616967122137525108154121304264697865568653100

noj_h的博客 2232

滑动窗口法

首先要思考如果用一个for循环,那么应该表示滑动窗口的起始位置,还是终止位置。如果只用一个for循环来表示滑动窗口的起始位置,那么如何遍历剩下的终止位置?给定一个含有n个正整数的数组和一个正整数target,找出该数组中满足其和≥target的长度最小的连续子数组,并返回其长度。窗口的起始位置如何移动如果当前窗口的值大于target了,窗口就要向前移动了(也就是该缩小了)。窗口的结束位置如何移动窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。下面来看看滑动窗口的方法。..............

wangzai32100的博客 824

Allegro模块复用:从原理图到PCB的完整流程与关键细节

本文详细介绍了Allegro模块复用从原理图到PCB的完整流程与关键细节,包括DSN和MDD文件的创建、模块调用的实战技巧以及双向同步与版本控制方法。通过标准化处理和高级复用技巧,能显著提升PCB设计效率,减少重复工作时间。适用于智能硬件和工业控制等领域的工程师。

weixin_30252709的博客 332

保姆级教程:用NovAtel Inertial Explorer 8.7搞定GNSS/INS紧组合后处理(附避坑指南)

本文提供NovAtel Inertial Explorer 8.7的GNSS/INS紧组合后处理全流程教程,涵盖环境准备、数据转换、基站坐标解算及紧组合处理等关键步骤。特别针对零基础用户,分享实用技巧和常见陷阱,帮助高效完成高精度组合导航数据处理,适用于测绘、自动驾驶等领域。

weixin_42614269的博客 282

Sentinel滑动时间窗口的原理及源码实现

我们一开始先对sentinel中与统计数据相关的对象进行了一个粗略的讲解,从最上层来看我们想要对qps的数据进行统计的都可以使用ArrayMetric,而ArrayMetric底层对qps数据统计是使用了滑动时间窗口算法来进行实现的,也就是基于LeapArray这个类的基础上去实现的。当然,当我们要统计qps的某一项数据时,我们需要先去调用LeapArray的currentWindow方法去对时间窗口进行一次更新,然后才能再去记录某一项的统计数据。

我神级欧文的博客 3033

把 ABAP 出站 IDoc 做到稳如老狗:从数据抽取到端口投递的全链路拆解

SAP出站IDoc创建流程解析 本文详细拆解了SAP系统中出站IDoc的创建流程,将其归纳为四个关键阶段:数据获取、数据转换、控制记录校验和端口投递。文章指出,IDoc的稳定性取决于整条流水线的设计质量,而不仅仅是字段映射。 核心要点包括: IDoc由控制记录和数据记录组成,需在WE31/WE30中定义段结构 2.数据获取阶段需明确触发点、依赖链和一致性保证 3.数据转换应遵循"结构版本+映射纪律"原则 4.控制记录校验决定IDoc能否发出,需与WE20伙伴配置匹配 5.端口类型(tRF

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 172

sentinel---滑动窗口的实现原理

sentinel--滑动时间窗口

qq_39203337的博客 1754

【机器学习】一文搞懂算法模型之:Transformer

必会算法模型之:Transformer

商务合作 | 面试培训 | 职场规划 ==>主页扫码 5609

医院批量排班实战指南(三)日期列表生成与时段批量操作

在上一篇《批量排班功能实现指南(二):日期与时段设置》中,我们完成了日期范围选择和重复规则配置的界面搭建,实现了从第一步到第二步的跳转功能。现在我们已经可以选择日期范围和重复规则,但还缺少最关键的功能——根据规则生成日期列表并进行时段配置。本篇将继续深入批量排班的核心功能——日期列表生成与时段批量操作。根据日期范围和重复规则智能生成日期列表为每个日期配置上午、下午、夜诊时段批量时段操作提升配置效率日期列表的展示与管理。

低代码布道师的博客 1347

【算法】滑动窗口

本文介绍滑动窗口的概述、算法框架以及应用。

代码星辰的博客 3037

达梦数据库导入报错:[警告]服务器与文件内数据的 CASE_SENSITIVE 参数不匹配,成功终止导入, 但出现警告dimp V8,本地编码:PG_GBK, 导入文件编码:PG_UTF8

达梦数据库管理系统的最新版本是8.0版本,简称DM8。DM8采用全新的体系架构,在保证大型通用的基础上,针对可靠性、高性能、海量数据处理和安全性做了大量的研发和改进工作,极大提升了达梦数据库产品的性能、可靠性、可扩展性,能同时兼顾OLTP和OLAP请求,从根本上提升了DM8产品的品质。达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。[警告]服务器与文件内数据的 CASE_SENSITIVE 参数不匹配,成功终止导入, 但出现警告。4.无视警告,输入y,回车。

十三月的博客 1万+

双端队列实现滑动窗口

当然主流程肯定还是一次遍历(数组、字符串都是如此),针对遍历的当前元素现在框定的窗口中的元素做校验判断,等达到窗口的限定大小之后,此时应该做扩大、收缩窗口处理(移动指针),当然这个过程也像是队列,队头弹出,队尾进入,我们本质上是不会保存所有的窗口信息,如果这样做的话就是暴力解法了,复杂度太高了,所以我们是在新旧窗口更替的时候做些操作,筛选出符合条件的值到最终的result中即可。不同的目标采用不同的数据结构,例如用滑动窗口找不重复的子串,可以用Map来做。明白双端队列是如何进行筛选值,也就是上面的那张图。

m0_64132144的博客 730

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

双端队列(Deque)详解:Python实现与滑动窗口应用全面解析

在程序设计中,数据结构的选择直接影响算法的性能和实现效率。双端队列(Deque)作为一种灵活且高效的线性数据结构,允许在队列的两端进行插入和删除操作,广泛应用于需要频繁操作两端数据的场景。本文将带领你深入探索双端队列的定义与特点,如何使用Python实现双端队列,并重点讲解其在解决滑动窗口问题中的应用。通过这些内容,你将能够更加高效地解决实际开发中的一些算法问题,提升编程能力与思维方式。

吴师兄大模型的博客 1526

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]

在 Java 中,Deque 是一个双端队列接口,它继承自 Queue 接口,支持在队列的两端进行元素的插入、删除和访问操作。LinkedList 是 Deque 接口的一个实现类,下面介绍 Deque<Integer> deque = new LinkedList<>(); 常见的操作。

多多的博客 684

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

用双端队列实现维护滑动窗口最大值

题目描述 有一个整型数组arr和一个大小为w的窗口,窗口从数组的左边滑到右边,每次滑动一个位置,请返回每次滑动的最大值。 一般思路分析 此题最容易想到的思路就是,每次窗口改变时,就把窗口内的元素遍历一遍,找出最大值,当然,此办法可行,只不过,相当于,每次都要遍历w次,也就是滑动窗口大小的次数,同时,总的时间复杂度就是O(n*w)。能否实现每次滑动窗口改变时,找到最大值的时间复杂度是O(1)呢? 用双端队列维护滑动窗口最大值 这就要涉及此算法的核心了,用双端队列来实现。 首先,解释几个概念: 双端队列:就是两

weixin_43923436的博客 507

双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]

Deque 是一个接口LinkedList 是这个接口的实现类。集合 关系 介绍 Deque 是一个接口 LinkedList 是这个接口的实现类

多多的博客 728

leetcode59题:滑动窗口的最大值(用双端队列实现)

题目描述: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 ...

Wenrui Xie的博客 867

滑动窗口的最大值(双端队列最优解+多语言实现)

在算法面试中,“滑动窗口的最大值”是高频考点之一,它不仅考察对滑动窗口思想的理解,更考验对数据结构(如双端队列)的灵活运用。掌握该思路后,不仅能解决本题,还能应对类似的“滑动窗口极值”问题(如最小值、第k大值等),在面试中做到举一反三。若题目改为“求滑动窗口的最小值”,只需将双端队列的“单调递减”改为“单调递增”——队列头部始终是当前窗口的最小元素下标,入队时删除所有大于当前元素的下标即可。双端队列(Deque)支持两端的插入和删除操作,我们可以利用它维护一个“单调递减序列”,队列中存储的是。

629

LeetCode 239 滑动窗口最大值的双端队列python实现

0. LeetCode 239 题解链接 1. 题目描述 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。 你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 2. 思路 ...

大头儿子的博客 441

滑动窗口 + 双端队列在实时 指标监控系统中的工程实现

技术方案的局限性(如窗口精度与内存占用的矛盾)未来方向:与机器学习结合(如动态阈值预测)

huang579147的博客 149

Java双端队列的学习以及滑动窗口最大值的Deque实现

一、双端队列 java.util接口 Deque<E> 类型参数:E - 此 collection 中保存的元素类型 所有已知实现类:ArrayDeque, LinkedBlockingDeque, LinkedList 一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”...

Fiona20的博客 478

Python双端队列deque详解:高效队列、滑动窗口与BFS实现

在数据结构中,队列和栈是基础且重要的线性结构,分别遵循先进先出(FIFO)和后进先出(LIFO)原则。其核心原理在于对序列两端的操作效率,传统列表在头部操作时因需移动元素而性能低下。Python的collections.deque通过优化的双向链表实现,在两端进行添加和删除操作均能达到O(1)时间复杂度,解决了这一性能瓶颈。这一特性在需要高效处理数据流的场景中价值显著,例如实现任务队列、实时数据分析、滑动窗口计算以及广度优先搜索(BFS)算法。deque还提供了maxlen参数,便于自动维护固定长度的序列,

weixin_29204749的博客 256

Leetcode239:滑动窗口最大值,双端队列的实现!

摘要:本文介绍了一种使用双端队列高效解决滑动窗口最大值问题的算法。给定数组nums和窗口大小k,算法通过维护一个存储索引的双端队列,确保队列头部始终是当前窗口最大值。遍历数组时,先移除超出窗口范围的元素,再移除尾部小于当前元素的无效值,最后将当前元素加入队列。当窗口形成时,记录队列头部元素作为最大值。该算法时间复杂度O(n),空间复杂度O(k),并提供C++和C两种实现代码。示例展示了对数组[1,3,-1,-3,5,3,6,7]执行k=3时的具体计算过程。

2301_80548884的博客 863

leetcode. [239]滑动窗口最大值(B-F(暴力实现),PQ(优先队列),Deque(双端队列),DP(动态规划))

Sliding Window Maximum 分析: 我们将数组从0扫描到n-1,将“promising”元素保留在双端队列中。 每个元素放置一次并轮询一次时,该算法将摊销O(n)。 在每个i处,我们保留“promising”元素,它们可能是窗口[i-(k-1),i]或任何后续窗口中的最大数量。 这意味着 如果双端队列中的某个元素不在i-(k-1)范围内,我们将其丢弃。 我们只需要从头开始轮询,因为我们使用的是双端队列,并且元素按数组中的序列排序 现在,只有[i-(k-1),i]中的那些元素在双端队.

your_棒棒糖的博客 252
上一篇: 给定一个栈,仅利用栈自身的结构逆序栈,不能借助其它数据结构
下一篇: 单调栈: 找出数组中任意位置左右两边比它大的数字
_nohave
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值