209. 长度最小的子数组
题意:
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其和
≥ target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度**。**如果不存在符合条件的子数组,返回0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
解题思路:
运用滑动窗口,定义一个总数用来存储滑动窗口内的总值.每一次总值都加上右下标的值,加完判断是否已经超出了target,超出需要记录一下位数,如果位数比较小就记录,否则就总值减去左边的值.知道遍历完整个数组.
代码:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int sum = 0;
int count = INT_MAX;
for (int right = 0; right < nums.size(); right++)
{
sum += nums[right];
while (sum >= target)
{
count = count < right - left + 1 ? count : right - left + 1;
sum -= nums[left];
left++;
}
}
if(count == INT_MAX)
return 0;
return count;
}
};
运行结果:
总结
运用数组的滑动窗口,数组总共遍历一次.时间复杂度为O(n).