1 问题描述
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3]是该条件下的长度最小的子数组。
提示:1 <= nums.length <= 100000。
2 解决路线
利用滑动窗口思想解决。滑动窗口最重要的是定义窗口的两端。
思路:
a.设置窗口的两端left和right,初始值为0。
b.计算窗口内数组元素的和sum。
c.如果sum<target,向右滑动right.
d.如果sum>=target,向右滑动left,并更新满足条件的窗口最小值。
e.返回最小值,得到结果。
3 代码实现
int minSubArrayLen(int target, int* nums, int numsSize){
int right = 0, left = 0;
int min = 100001;
int sum = 0;
while(right < numsSize) {
sum += nums[right];
if(sum < target) {
right++;
continue;
} else {
while(sum >= target) {
sum = sum - nums[left++];
}
if(min > (right-left+2)) {
min = right-left+2;
}
right++;
}
}
if(min == 100001) {
min = 0;
}
return min;
}