Leetcode 209 长度最小的子数组

题目要求:给定一个含有 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的子数组如果不存在符合条件的子数组,返回 0。

分析:要求是连续子数组,所以我们必须定义i,j两个指针,i向前遍历,j向后遍历,相当与一个滑块,这样所有的子数组都会在[i...j]中出现,如果nums[i..j]的和小于目标值s,那么j向后移一位,再次比较,直到大于目标值s之后,i向前移动一位,缩小数组的长度。遍历到i到数组的最末端,就算结束了,如果不存在符合条件的就返回0.

代码:class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int l=0,r=-1;//nums[l...r]为滑动窗口
        int sum=0;
        int res=nums.size()+1;//初始满足长度不存在
        while(l<nums.size())
        {
            if(sum<s&&r+1<nums.size()//r+1<nums.size()是防止数组越界
                sum+=nums[++r];
            else
                sum-=nums[l++];
            if(sum>=s)
                res=min(res,r-l+1);
        }
        if(res==nums.size()+1)
            return 0;
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34691713/article/details/80266358