日野弥生:勉強しよう

sliding window

发表于2025年01月02日

#滑动窗口 #双指针

介绍

滑动窗口(sliding window)是一种常见的算法技巧,通常用于解决字符串、数组等数据结构相关的问题。 滑动窗口算法的基本思想是维护一个滑动窗口,该窗口通常是一个固定大小的子序列,并且该子序列通常是连续的。然后,通过滑动窗口的方式,不断地更新窗口的位置和大小,以便解决问题。滑动窗口实质上就是队列

介绍

在字符串S中使用双指针中的左右指针技巧,初始化left=right=0,把索引左闭右开区间 $[left, right)$ 称为一个窗口。

不断地增加 right 指针扩大窗口 $[left, right)$, 直到窗口中的字符串符合要求(包含了 T 中的所有字符)。此时停止增加right,转而不断增加left指针缩小窗口 $[left, right)$, 直到窗口中的字符串不再符合要求(不包含T中的所有字符了)。

同时,每次增加left,都要更新一轮结果。

重复第2和第3步,直到 right 到达字符串 S 的尽头。

例题

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。

滑动窗口右边界滑动的条件是满足大于等于目标值,左边界是小于目标值,可以把所有满足条件的子数组在O(n)次遍历过程中寻找所有的子数组。找到其中长度最短的子数组。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int slow=0,fast=0,sum=0,length=nums.size();
        bool fastMeet = false;
        for(;fast<nums.size();fast++)
        {
            sum+=nums[fast];
            while(sum>=target)
            {
                fastMeet=true;
                length=length<(fast-slow+1)?length:(fast-slow+1);
                sum-=nums[slow];
                slow++;
            }
        }
        return fastMeet?length:0;
    }
};

算法思想:https://juejin.cn/post/7248606482026676282

上一篇

two pointers