滑动窗口——LeetCode209. 长度最小的子数组/713. 乘积小于 K 的子数组

本文介绍了滑动窗口算法在解决两个问题上的应用:寻找长度最小的子数组使其和大于目标和,以及统计乘积小于给定K的子数组数量。通过双指针技巧,动态调整窗口范围以找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

滑动窗口思路

利用双指针L和R,指示窗口的左边界和右边界,问题一般是问一个子串或子数组满足某些条件的时候子串/子数组的长度最大或最小。

  1. 初始时,L和R均位于下标0处,窗口大小为0;
  2. 开始扩展窗口,移动右指针R扩大窗口,使窗口满足题目的条件;
  3. 满足 题目条件后,移动左指针L,使得窗口满足题目要求的最大或最小
  4. 右指针R到达字符串/数组末尾后结束循环;

209. 长度最小的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
            int l=0,r=0,sum=0,ans=0x3f3f3f3f;
            while(r<nums.size())
            {
                while(sum<target&&r<nums.size())
                {
                    sum+=nums[r];
                    r++;
                }
                while(l<=r&&sum>=target)
                {
                    sum-=nums[l];
                    if(r-l<ans)
                        ans=r-l;
                    //cout<<l<<" "<<r<<" "<<ans<<endl;
                    l++;
                }
            }
            if(ans==0x3f3f3f3f)
                ans=0;
            return ans;
    }
};

713. 乘积小于 K 的子数组

这题是统计满足条件的窗口内的子数组数量

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        int l=0,r=0,ans=0,mul=1;
        while(r<nums.size())
        {
            mul*=nums[r];
            while(mul>=k&&l<=r)
            {
                mul/=nums[l];
                ++l;
            }
            ans+=r-l+1;
            ++r;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值