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
利用滑动窗口的思想,对该数组进行访问,左右指针卡出一个滑动区间,由于是一个正整数序列,所以right加入一个数这个区间肯定变大,left少一个数肯定会变小,里面这个单调性质来和target作比较,每次维护一个数组的最小长度即可。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0, right = 0, sum = 0;
int n = nums.size();
int ret = INT_MAX; // 出错点2、对于INT_MAX的使用,刚开始将ret最大值定义为数组长度,忽略了示例三情况
while(right < n)
{
// sum += nums[right++] 出错点1,提前对right进行了++操作,导致下面访问出错
sum += nums[right];
while(sum >= target)
{
ret = min(ret, right-left+1);
sum -= nums[left++];
}
right++; // 应该在访问right完成之后进行++
}
return ret == INT_MAX ? 0 : ret;
}
};