滑动窗口与双指针法

滑动窗口也能理解为一种双指针法

而滑动窗口是不断调节子序列的起始和终止位置来获得我们想要的结果

例题:209. 长度最小的子数组 - 力扣(LeetCode)

在该题中需要我们找出满足条件的子数组,可以用暴力解法双层循环遍历数组求得数组的所有子数组并获得长度最小符合条件的子数组,其时间复杂度为O(n^2)。

滑动窗口法可以将时间复杂度降为O(n),代码如下

int minSubArrayLen(int target, int* nums, int numsSize) {
    int top=0,low=0;
    int sum=0,minsize=INT_MAX,size=0;
    for(top=0;top<numsSize;top++)
    {
        sum+=nums[top];
       while(sum>=target)
       {
        size=top-low+1;
        minsize=minsize<size?minsize:size;
        sum-=nums[low++];
       }
    }
    return minsize == INT_MAX ? 0 : minsize;
}

top指针与low指针都初始化指向数组首位,top为子数组右边界,low为子数组左边界,右边界向右扩张,当子数组数值之和(sum)大于等于给定的target值时,记录当前子数组长度,向右收缩左边界(数组数值之和减去low指针所指数,low指针向右移动)直到sum小于targat时继续扩张右边界直到完成遍历整个数组

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值