前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Sliding Window Algorithm滑动窗口算法-Java快速进阶教程

Sliding Window Algorithm滑动窗口算法-Java快速进阶教程

作者头像
jack.yang
发布于 2025-04-05 11:31:37
发布于 2025-04-05 11:31:37
820
举报

1. 概述

在处理需要检查给定数组中某些范围的答案的问题时,滑动窗口算法可能是一种非常强大的技术。

在本教程中,我们将解释滑动窗口技术及其变体,即固定窗口大小和灵活窗口大小。此外,我们将提供两种变体的示例,以便更好地理解。

2. 理论思想

滑动窗口技术背后的主要思想是将两个嵌套循环转换为单个循环。通常,该技术可以帮助我们将时间复杂度从 降低到

使用滑动窗口技术的条件是,问题要求为函数查找最大值(或最小值),该函数重复计算数组中一组范围的答案。也就是说,如果这些范围可以根据它们的开始进行排序,并且它们的结束也变得排序,那么我们可以使用滑动窗口技术。

换句话说,必须满足以下条件:如果

那么可以得到

,其中

区间的左侧,并且

是同一个区间的左侧末端。

基本上,这种技术允许我们迭代包含两个指针L和R的数组。这两个指针分别表示当前范围的左端点和右端点。在每一步中,我们要么就不移动L、R,要么将它们两个全都移动到下一个范围。

为此,我们必须能够在R向前移动时向当前范围添加元素。此外,还必须能够在向前移动L时从当前范围中删除元素。每次到达某个范围时,我们就根据当前范围内的元素计算答案。

如果范围的长度是固定的,我们称之为固定大小的滑动窗口技术。然而,如果改变了范围的长度,我们称之为灵活窗口大小技术。我们将提供这两种选项的示例。

3.固定大小的滑动窗口

让我们看一个例子来更好地理解这个想法。

3.1. 问题

假设问题给我们一个长度为n和数字k的数组。问题要求我们找出数组中连续的k个元素的最大和。

换句话说,首先,我们需要计算数组中所有长度为k的范围的和。然后,我们必须返回所有计算出来的和中的最大和。

3.2. 朴素法

让我们来看看解决这个问题的朴素法:

首先,遍历所有可能的起始区间。对于每个区间,我们从L到L + k - 1遍历其元素,并计算它们的和。在每一步之后,我们更新到目前为止的最佳答案。最后,这个答案会变成原来的答案与当前计算结果之间的最大值。

最后,我们返回在所有范围中找到的最佳答案。

在最坏情况下,时间复杂度为O(n^2),其中n是数组的长度。

3.3. 滑动窗口算法

让我们尝试改进我们的原始方法以达到更好的复杂度。

首先,让我们找出两个连续区间之间的关系。第一个范围显然是[1,k]。但是,第二个范围将是[2,k+1]。

为了从第一个区间移动到第二个区间,我们执行了两个操作:第一个操作是将索引为k+1的元素与答案相加。第二个操作是从答案中删除索引为1的元素。

每次,在我们计算出相应范围的答案后,我们只是最大化我们计算出的总答案。

让我们看看上述问题的解决方案:

首先,我们计算第一个范围[1,k]的和。其次,我们将其和存储为到目前为止的答案。

然后,遍历区间[k+1, n]的所有可能的端点。在每一步中,我们更新当前范围的和。因此,我们增加索引i处元素的值,并删除索引i-k处元素的值。

每次,我们更新到目前为止找到的最佳答案,使其成为原始答案和新计算的总和之间的最大值。最后,我们返回在所有测试范围中找到的最佳答案。

该方法的时间复杂度为O(n),其中n是数组的长度。

4. 灵活大小的滑动窗口

我们将灵活大小的滑动窗口技术称为双指针技术。我们也将以这种技术为例来更好地解释它。

4.1. 问题

假设我们有n本书排成一行。对于每一本书,我们知道阅读它所需的分钟数。然而,我们只有k分钟的空闲时间来阅读。

此外,我们应该读一些连续的书从行。换句话说,我们可以从一行的书中选择一个范围来阅读它们。当然,条件是阅读这些书所需的时间总和不能超过k。

因此,这个问题要求我们找到我们可以阅读的书的最大数量。也就是说,我们需要从数组中找到一个和不超过k的范围,以便这个范围的长度是可能的最大值。

4.2. 朴素法

看看解决问题的朴素法:

首先,我们用0初始化到目前为止最好的答案。接下来,遍历范围的所有可能起点。对于每个开始,我们向前迭代,直到我们可以阅读更多的书。一旦我们无法再阅读更多的书,我们就更新最佳答案,使其达到旧答案和我们找到的范围长度之间的最大值。

最后,我们返回我们设法找到的最佳答案。

这种方法的复杂度是O(n^2),其中n是图书数组的长度。

4.3. 滑动窗口算法

我们将尝试改进原始方法,以获得线性复杂度。

首先,假设我们成功地找到了从数组开头开始的范围的答案。下一个范围从数组中的第二个索引开始。但是,第二个范围的结束肯定在第一个范围结束之后。

原因是第二个范围没有使用第一个元素。因此,第二个范围可以进一步扩展它的末端,因为它现在有更多的空闲时间可以使用。

因此,当从一个范围移动到另一个范围时,我们首先删除当前答案的旧开头。此外,我们尝试尽可能地扩展当前的范围。

因此,最后,我们将遍历所有可能的范围,并存储找到的最佳答案。

下面的算法对应于刚才解释的想法:

与简单的方法一样,我们遍历范围的所有可能的起点。对于每个起点,我们首先从当前和中减去下标L-1的值。

之后,我们将尽可能地移动R。因此,只要和仍然不超过k,我们就继续移动R。最后,更新到目前为止的最佳答案。由于当前范围的长度是R-L,我们用这个值最大化最佳答案。

虽然该算法的复杂度看起来是O(n^2),但我们还是要仔细分析一下该算法。变量R总是保持它的值。因此,它只会向前移动,直到达到n的值。因此,我们总共执行while循环的次数最多为n次。

因此,该方法的复杂度为O(n),其中n是数组的长度。

5. 差异

主要的区别在于,在一些问题中,我们被要求在相同大小的所有范围中检查某个属性。另一方面,在其他一些问题中,要求在满足一定条件的所有范围中检查某个性质。在这些情况下,这种情况可能会使范围的长度发生变化。

如果这些范围的大小已知(比如连续元素的问题),我们肯定会使用固定大小的滑动窗口技术。但是,如果区间的大小不同(比如书长的问题),我们肯定会使用可变大小的滑动窗口技术。

此外,在使用我们在开头介绍的滑动窗口技术时,一定要记住以下条件:我们必须保证向前移动L指针一定会使R保持在原来的位置,或者也会将其向前移动。

6. 结论

在本教程中,我们解释了滑动窗口方法。为该技术提供了理论思路。此外,我们还介绍了固定大小和可变大小滑动窗口技术的两个示例。最后,我们解释了何时使用每种技术。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
基础算法---滑动窗口
滑动窗口(Sliding Window)是一种在计算机科学中用于解决各种子数组或子字符串问题的技术。滑动窗口技术通过维护一个固定大小的窗口在数组或字符串上移动,从而使得可以在较短的时间内解决一些复杂的问题。这种方法在处理一系列数据时特别高效。滑动窗口(Sliding Window)是一种在计算机科学中用于解决各种子数组或子字符串问题的技术。滑动窗口技术通过维护一个固定大小的窗口在数组或字符串上移动,从而使得可以在较短的时间内解决一些复杂的问题。这种方法在处理一系列数据时特别高效。
用户11305458
2024/10/09
7990
基础算法---滑动窗口
深入理解滑动窗口算法及其经典应用
滑动窗口技术通常用于解决子数组或子串相关的问题。其主要思想是在数组或字符串上维持一个固定的窗口大小,或在特定条件下调整窗口大小,从而在窗口内进行高效的计算。滑动窗口技术可以帮助我们在O(n)的时间复杂度内解决一些需要遍历整个数组或字符串的问题。 滑动窗口的基本步骤包括:
DevKevin
2024/08/29
3960
有点难度,几道和「滑动窗口」有关的算法面试题
滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合。
五分钟学算法
2019/05/06
9640
有点难度,几道和「滑动窗口」有关的算法面试题
[享学Netflix] 二十一、Hystrix指标数据收集(预热):滑动窗口算法(附代码示例)
代码下载地址:https://github.com/f641385712/netflix-learning
YourBatman
2020/03/19
1.4K0
[享学Netflix] 二十一、Hystrix指标数据收集(预热):滑动窗口算法(附代码示例)
【优选算法篇】一文读懂滑动窗口:动态调整范围的算法利器(上篇)
滑动窗口(Sliding Window)是一种高效的算法思想,广泛应用于数组和字符串问题,特别是涉及子数组、子字符串、窗口内统计等场景。它的重要性在于:
熬夜学编程的小王
2024/12/24
1.5K0
【优选算法篇】一文读懂滑动窗口:动态调整范围的算法利器(上篇)
【优选算法】Sliding-Chakra:滑动窗口的算法流(上)
把一个较长的序列(比如数组、字符串等),划分成一个个固定长度或者动态长度的 “子序列”,这个子序列就被称作窗口 。好比通过一个固定大小的窗框在一幅长画卷上逐步移动,每次窗框圈定的部分就是一个窗口内容,窗口会按照特定的规则在序列上 “滑动”,常见的是每次移动一个元素的位置,新元素进入窗口,同时最靠前的旧元素移出窗口,借此不断更新窗口内的数据集合
DARLING Zero two
2024/12/28
1660
【优选算法】Sliding-Chakra:滑动窗口的算法流(上)
滑动窗口算法通用思想
本文详解「滑动窗口」这种高级双指针技巧的算法框架,带你秒杀几道难度较大的子字符串匹配问题:
全栈程序员站长
2022/11/16
4600
初识算法 · 滑动窗口(1)
本文开始,介绍的是滑动窗口算法类型的题目,滑动窗口本质上其实也是双指针,但是呢,前文介绍的双指针是二者相向移动的:
_lazy
2024/10/16
1140
初识算法 · 滑动窗口(1)
我写了套框架,把滑动窗口算法变成了默写题
东哥带你手把手撕力扣~ 作者:labuladong 公众号:labuladong 若已授权白名单也必须保留以上来源信息 我有预感本文要火,所以先罗列一下我们号的所有算法套路集锦文章: 数据结构和算法学习指南 动态规划框架套路详解 回溯算法框架套路详解 BFS算法框架套路详解 二分搜索框架套路详解 双指针技巧套路汇总 滑动窗口框架套路详解(本文) 目前来说,以上几篇文章属于我们的镇号之宝,一直被其他人模仿,然而从未被超越。🤔 言归正传,鉴于前文 我作了首诗,保你闭着眼睛也能写对二分查找 的那
labuladong
2021/09/23
5500
JavaScript刷LeetCode拿offer-滑动窗口
《JavaScript刷LeetCode拿offer-双指针技巧》中,简单地介绍了双指针技巧相比较单指针的优点,以及结合 Easy 难度的题目带大家进一步了解双指针的应用。
hellocoder2028
2022/11/01
3120
leetcode 1208. 尽可能使字符串相等-----滑动窗口篇五,前缀和篇一,二分篇一
枚举 s 的所有子串,判断当前和 t 中的子串的「汉明距离」总和是否不大于 maxCost ,更新最大长度即可。
大忽悠爱学习
2021/11/15
6940
精读《算法 - 滑动窗口》
滑动窗口算法是较为入门题目的算法,一般是一些有规律数组问题的最优解,也就是说,如果一个数组问题可以用动态规划解,但又可以使用滑动窗口解决,那么往往滑动窗口的效率更高。
黄子毅
2022/03/15
6470
精读《算法 - 滑动窗口》
leetcode必备算法:聊聊滑动窗口
我们刷leetcode的时候,经常会遇到滑动窗口类型题目。滑动窗口问题非常经典,也很有技巧性,一般大厂也喜欢问。今天跟大家一起来学习滑动窗口的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~
捡田螺的小男孩
2021/11/15
1.7K0
leetcode必备算法:聊聊滑动窗口
【优选算法篇】滑动窗口的艺术:如何动态调整子区间解决复杂问题(中篇)
接上篇:【优选算法篇】一文读懂滑动窗口:动态调整范围的算法利器(上篇)-CSDN博客
熬夜学编程的小王
2024/12/24
2080
【优选算法篇】滑动窗口的艺术:如何动态调整子区间解决复杂问题(中篇)
【刷题】滑动窗口入门
滑动窗口算法的基本思想是使用双指针(有时也可能使用更多指针)来表示窗口的边界。在每一步中,我们可以根据特定条件来移动窗口的边界,并更新所需的统计信息。
叫我龙翔
2024/03/20
1600
【刷题】滑动窗口入门
滑动窗口算法学习
给一组大小为n的整数数组,计算长度为k的子数组的最大值 比如:数组{1,2,3,4,5,7,6,1,8},k=2,那么最终结果应该是7+6=13最大。 最简单的是使用两层遍历,通过所有情况找出最大的一个子数组,时间复杂度O(N^2) 使用滑动窗口,从[0,k-1]的一个窗口,记录其总和,然后窗口向右移动到[1,k],再到[2,k+1],直到数组的最尾端,找出里面总和最大的一个窗口,这样的解法就是滑动窗口算法。
全栈程序员站长
2022/11/01
2610
滑动窗口算法的基本思想、应用场景、实现方法、时间复杂度和常见问题
滑动窗口算法(Sliding Window)是一种常用的双指针算法,被广泛应用于字符串和数组等数据结构中的子串或子数组问题,例如字符串匹配、最长子串、最小覆盖子串等问题。滑动窗口算法可以优化暴力枚举的时间复杂度,使得算法的执行效率更高。
网络技术联盟站
2023/06/04
3.3K0
【c++算法篇】滑动窗口
滑动窗口是一种常用的算法技术,它适用于需要检查序列(如数组或字符串)中的一系列连续元素的问题。通过维护序列中的一段特定大小的连续元素集,滑动窗口减少了不必要的重复计算,从而优化了性能。这种技术经常用于求解最大或者最小总和、长度满足特定条件的子串或子数组的问题。
用户11029103
2024/05/24
2650
【c++算法篇】滑动窗口
【算法专题】滑动窗口
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组[numsl, numsl + 1, …, numsr - 1, numsr] ,并返回其长度。 如果不存在符合条件的子数组,返回 0 。
YoungMLet
2024/03/01
1510
2023-04-03:如何使用滑动窗口算法和回溯算法解决亚马逊面试题——最长连续相同元素子序列问题?
比如数组arr = { 3, -2, 3, 3, 5, 6, 3, -2 }, k = 3
福大大架构师每日一题
2023/04/03
3000
2023-04-03:如何使用滑动窗口算法和回溯算法解决亚马逊面试题——最长连续相同元素子序列问题?
推荐阅读
相关推荐
基础算法---滑动窗口
更多 >
目录
  • 1. 概述
  • 2. 理论思想
  • 3.固定大小的滑动窗口
    • 3.1. 问题
    • 3.2. 朴素法
    • 3.3. 滑动窗口算法
  • 4. 灵活大小的滑动窗口
    • 4.1. 问题
    • 4.2. 朴素法
    • 4.3. 滑动窗口算法
  • 5. 差异
  • 6. 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档