题目:
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其总和大于等于
target
的长度最小的 子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0 。
代码:
方法一:滑动窗口 + sum 数组
cpp
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int len = nums.size();
bool flag = false;
int ans = len;
for (int i = 0, s = 0; i < len;
i++) { // 判断从[0, i] 是否满足大于等于 target
s += nums[i];
if (s >= target) {
flag = true;
ans = i + 1;
break;
}
}
if (!flag)
return 0; // 整个数组元素之和无法满足
vector<long long> sum(len, 0);
sum[0] = nums[0];
for (int i = 1; i < len; i++) { // 计算 sum 数组
sum[i] = sum[i - 1] + nums[i];
}
int tmp = ans; // 记录当前合法区间的终点 [0, ans-1]
for (int i = 0; i < tmp; i++) { // 减少前面的冗余部分 [tmp-ans ,tmp-1]
if (sum[tmp - 1] - sum[i] >= target)
ans--;
}
for (int i = ans; i < len; i++) { // 逐步扩展后面的元素
bool f = false;
while (sum[i] - sum[i - ans] >= target) { // 扩展后逐步减少前面的冗余元素
ans--;
f = true;
}
if (f) // 补足
ans++;
}
return ans;
}
};