题目描述
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0
题解
先扩充滑动窗口至元素和大于等于target,计算窗口长度,并且缩小窗口直至小于target,此时再度扩大至大于等于target,如此反复直到窗口右端到数组末端且窗口内元素和小于target
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left=0, right=0;
int sum=0;
int length=100001;
int wlen=length;
while(right<nums.size())
{
sum+=nums[right];
while(sum>=target)
{
wlen=right-left+1;
length = wlen<length ? wlen : length;
sum-=nums[left++];
}
right++;
}
return length==100001 ? 0 : length;
}
};
注意事项
1.滑动窗口的大小是两端点之差+1
2.题目要求大于等于,我看成了等于导致调试半天不知道错在哪orz...
3.该算法时间复杂度为O(n)