题目描述
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度**。**如果不存在符合条件的子数组,返回 0
。
算法描述
用两个指针 i 和 j 分别表示滑动窗口的开始位置和结束位置,维护滑动窗口内子数组之和sum
。
每一轮迭代,指针 i 不断的向右移动,扩大滑动窗口的大小。如果滑动窗口内子数组之和sum
大于等于目标值target
,则更新子数组的最小长度。同时让指针 j 也不断的向右移动,减小滑动窗口的大小,直到sum < target
。移动过程中,更新子数组的最小长度。
复杂度分析
时间复杂度是 O ( n ) O(n) O(n)
程序代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
int res = n + 1;
int i = 0, j = -1, sum = 0;
while(i < n) {
sum += nums[i];
while(sum >= target) {
res = min(res, i - j);
j++;
sum -= nums[j];
}
i++;
}
if(res == n + 1) res = 0;
return res;
}
};