滑动窗口——长度最小子数组

什么是滑动窗口 ?

滑动窗口,也称为双指针,但这个双指针是同向移动,适用于一些具有单调性的问题。也类似于暴力枚举,但并不是都要一一枚举。

滑动窗口的解题思路基本为:定义双指针,进窗口,判断,出窗口,更新结果

题目:

根据滑动窗口,我们来说一下思路:先定义两个指针指向头,然后left不变,每次对right及之前的数字求和然后right++(求得left和right之间的和)。我们以示例1为例:

两个指针的移动规则时,只要sum<target,我就让right++直到求和≥target。当发生此情况时,让left++然后重新计算二者之间的和(求和的方法我们可以用上一次的和-nums[left-1]。二者之间的区域我们就可以看成窗口在之间滑动,left每移动一次(符合条件的子数组),就记录一下当前的窗口长度。然后比较每一次的长度取min,直到right走到结尾。

我们发现,滑动窗口对于此题就相当于帮我们省去没必要的遍历,就以上图为例,此时sum=8,那么我就没必要枚举让right右移的所有子数组了(枚举的话虽然也一定符合target但是长度不是最短)。

cpp 复制代码
int Solution(vector<int<&nums,int target)
{

   int n=nums.size(),sum=0,len=INT_MAX;
   for(int left=0,right=0;right<n;right++)
     {
        sum+=nums[right];//窗口右扩
        while(sum>=target)
        {
          len=min(len,right-left);
          sum-=nums[left++];//窗口左缩
        }
     }
  
  return len==INT_MAX? 0 :len; //防止整个数组都不满足的情况
}
相关推荐
qq7422349843 小时前
APS系统与OR-Tools完全指南:智能排产与优化算法实战解析
人工智能·算法·工业·aps·排程
A尘埃3 小时前
超市购物篮关联分析与货架优化(Apriori算法)
算法
.小墨迹3 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
不穿格子的程序员3 小时前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心
大江东去浪淘尽千古风流人物3 小时前
【SLAM新范式】几何主导=》几何+学习+语义+高效表示的融合
深度学习·算法·slam
重生之我是Java开发战士4 小时前
【优选算法】模拟算法:替换所有的问号,提莫攻击,N字形变换,外观数列,数青蛙
算法
仟濹4 小时前
算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径
算法·leetcode·深度优先
yang)4 小时前
欠采样时的相位倒置问题
算法
历程里程碑4 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
A尘埃4 小时前
物流公司配送路径动态优化(Q-Learning算法)
算法