万事开头难
滑动窗口
就是不断的调节子序列的起始位置和终止位置,从而得到我们想要的结果。
只用一个for循环,一定是表示滑动窗口的终止位置。
本题主要确定三个点:
1.窗口内是什么
2.如何移动窗口的起始位置
3.如何移动窗口的结束位置
本题的窗口需要满足大于等于target
int minSubArrayLen(int target, int* nums, int numsSize){
//滑动窗口
int minLenth = INT_MAX ;
int minsize = 0;
int sum = 0;
int right = 0; //指向起始位置
int left = 0; //指向终点位置
for(;left < numsSize;left++){ //向终点移动
sum += nums[left];
while(sum >= target){ //当sum的值大于等于目标值,保存长度,收缩起点
minsize = left - right +1;
sum -= nums[right];
right++;
minLenth = minsize < minLenth ? minsize : minLenth; //最初错误为 minsize < INT_MAX,minLenth一直被更新为离终点最近的子数组长度
}
}
return minLenth == INT_MAX ? 0 : minLenth ;
}