题目:
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
方法:滑动窗口法
思路:什么是滑动窗口法?
滑动窗口就是利用两个指针,两个指针之间的就是一个窗口,窗口内存放的是满足条件的长度最小的连续子数组。首先将两个指针都放在数组起始的位置,然后后面的指针往后移动,当满足窗口内的元素和>=target时停止并保存当前窗口的长度与前一个窗口的长度作比较,保留最小的值。最后当全部遍历完时,保留的就是长度最小的子数组的长度。需要注意的是一个for循环中的变量表示的是子数组终止的位置而不是起始的位置。
关于如何保存长度最小的子数组的长度。首先定义result=INT32_MAX(表示32位整数所能表示的最大整数),其次利用result=result<len?result:len,保存最小的长度。原理是刚开始result被定义为了最大的数,所第一次循环中result不可能小于len,从而result被赋值为了第一个满足条件的子数组的长度。往后每次循环,有更小的长度时就会被赋值给result直到结束。
题解:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX; //定义result为最大的整数
int len = 0;
int sum = 0;
int i = 0;
for (int j = 0; j < nums.size(); j++){ //表示窗口的终止位置
sum += nums[j];
while(sum >= target){
len = (j - i) + 1;
result = result < len ? result : len;
sum -= nums[i++]; //当有满足条件的子数组出现时,移动起始位置
}
}
return result == INT32_MAX ? 0 : result;
}
};