【寻找one piece的算法之路】滑动窗口

💐个人主页初晴~

📚相关专栏:寻找one piece的刷题之路


什么是滑动窗口

滑动窗口算法是一种常用的算法模式,通常用于字符串匹配数组操作等问题中,特别是需要在一段连续的数据中寻找满足特定条件的子序列问题。它通过维护一个窗口(一段连续的子数组或子串),并在数据结构上滑动(移动)这个窗口,来寻找最优解或者满足特定条件的子序列。

滑动窗口算法的基本步骤

  1. 初始化窗口:选择一个起始点,并确定窗口的初始大小。
  2. 扩展窗口:从起始点开始,向右扩展窗口,直到找到一个满足特定条件的子序列。
  3. 收缩窗口:如果当前窗口的子序列仍然满足条件,尝试从左侧收缩窗口,直到不满足条件为止。
  4. 更新结果:在每次扩展和收缩窗口之后,检查当前窗口是否是最优解,并更新结果。
  5. 重复步骤:重复上述步骤,直到遍历完整个输入数据。

滑动窗口算法的优点

  • 效率高:相比暴力解法,滑动窗口算法可以在O(n)的时间复杂度内解决问题,其中n是输入数据的长度。
  • 易于实现:算法逻辑简单,易于理解和实现。
  • 适用性广:可以应用于多种不同类型的问题。

一、⻓度最⼩的⼦数组

题目链接

题目描述:

题目分析:

因为这题计算的是某一段区间的元素总和,是连续的,就可以尝试用滑动窗口来解决。每次固定好左指针l,然后让右指针r 不断向右遍历数组,并记录累加和sum,直到第一次区间【l,r】的sum>target时,我们就找到了以 l 为起始点的最大窗口,接着就没必要再继续向右扩展窗口了。此时就可以尝试舍去l,让l向右移动,缩小窗口,由于我们已经知道区间【l,r】的元素和了,就没必要再遍历计算一遍了。将sum减去之前 l 所指的元素值,就能得到区间【l+1,r】的元素和了。以此类推,我们只要不断维护好这个区间就能得出最终结果了

滑动流程:

1、初始化窗口:定义两个指针 l 和 r ,一开始都让他们指向0位置

2、扩展窗口:让 r 指向的元素“进入窗口”

3、收缩窗口:判断此时窗口内元素和与target大小关系

  • 如果大于等于:更新结果,将左端元素划出去的同时继续判断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件)
  • 如果小于:说明窗口太小,  right++ ,另下⼀个元素进⼊窗⼝

4、重复步骤:重复上述步骤2与3,直到 指针r 遍历完整个输入数据

代码实现:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n=nums.length,min=
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值