给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
- 输入:s = 7, nums = [2,3,1,2,4,3]
- 输出:2
- 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
提示:
- 1 <= target <= 10^9
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
- 209. 长度最小的子数组 - 力扣(LeetCode)
-
class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int sum=0; int result=nums.size()+1; //一开始设置一个比最大长度还大的结果 int i=0; //滑动窗口的起始位置 for(int j=0;j<nums.size();j++) //j为滑动窗口的终止位置 { sum+=nums[j]; while(sum>=target) { int length=j-i+1; result=length<=result?length:result; sum-=nums[i]; i++; } } return result==nums.size()+1?0:result; //如果result的值还是初始的比最大长度还大的值,说明没有任何符合条件的数组,则返回0 } };
重点:
-
1.一开始要设置一个比最大长度还大的结果,如果有比他小的就替换。
-
2.开始时刻,滑动窗口的起始位置和终止位置都是0,然后终止位置在for循环中依次往右移动,直到sum大于等于target,此时再用while循环让起始位置向右移动,找到最小长度的数组,记得每循环一次while,减去窗口外的值,并且i++。
出自:代码随想录