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

什么是滑动窗口 ?

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

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

题目:

根据滑动窗口,我们来说一下思路:先定义两个指针指向头,然后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; //防止整个数组都不满足的情况
}
相关推荐
fie88896 小时前
NSCT(非下采样轮廓波变换)的分解和重建程序
算法
晨晖27 小时前
单链表逆转,c语言
c语言·数据结构·算法
im_AMBER9 小时前
Leetcode 78 识别数组中的最大异常值 | 镜像对之间最小绝对距离
笔记·学习·算法·leetcode
鼾声鼾语9 小时前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
LYFlied9 小时前
【每日算法】LeetCode 25. K 个一组翻转链表
算法·leetcode·链表
Swizard9 小时前
别再迷信“准确率”了!一文读懂 AI 图像分割的黄金标尺 —— Dice 系数
python·算法·训练
s09071369 小时前
紧凑型3D成像声纳实现路径
算法·3d·声呐·前视多波束
可爱的小小小狼9 小时前
算法:二叉树遍历
算法
d111111111d10 小时前
在STM32函数指针是什么,怎么使用还有典型应用场景。
笔记·stm32·单片机·嵌入式硬件·学习·算法
AI科技星11 小时前
质量定义方程常数k = 4π m_p的来源、推导与意义
服务器·数据结构·人工智能·科技·算法·机器学习·生活