【题目/长度最小的字数组】滑动窗口

dd322e1984d748bfa4e716295cca2971.png

 class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
    int start=0;
    int end=0;
    int ans=nums.size()+1;
    int sum=0;
    int n=nums.size()-1;
        while(end<=n){
            sum+=nums[end];
            while(sum>=target){
                ans=min(ans,end-start+1);
                sum-=nums[start];
                start++;
            }
            end++;
        }
        return (ans != nums.size() + 1) ? ans : 0;
    }
};

解题思路:

  1. 定义两个指针 startend,它们分别表示滑动窗口的左边界和右边界,初始值都为0。

  2. 定义变量 ans 来记录找到的最小长度的子数组,初始值设置为大于数组长度的任何值。

  3. 定义变量 sum 来记录滑动窗口内元素的和,初始值为0。

  4. 计算数组的长度 n,以便在循环中使用。

  5. 进入循环,循环的条件是 end 不超过数组的末尾。

  6. 在每次迭代中,将 nums[end] 添加到 sum 中,以扩展滑动窗口。

  7. 检查 sum 是否大于等于 target,如果是,则计算当前子数组的长度 end - start + 1,并与 ans 比较,将较小的值更新到 ans 中。

  8. 缩小滑动窗口,通过将 nums[start]sum 中减去,并递增 start,表示将窗口的左边界向右移动一个位置。

  9. 继续迭代,直到 end 到达数组的末尾。

  10. 最后,检查 ans 是否仍然等于初始值,如果是,说明没有找到满足条件的子数组,返回0;否则返回 ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值