/**
* @Description 典型的滑动窗口问题
* nums[left .... right] 为我们的滑动窗口
* 如果当前sum < target 则窗口右面的边界右移,扩大窗口大小,sum = sum + nums[right]
* 如果当前sum >= target 则窗口左边界右移,缩小窗口大小,sum = sum - nums[left],记录数组大小
*
* @Date 2022/1/9 7:31 下午
* @Author wuqichuan@zuoyebang.com
**/
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
//right = -1是为了确保刚初始化的时候,窗口里是没有有效数据了
int right = -1;
int sum = 0;
int minLength = nums.length + 1;
while (left < nums.length){
//先确定好当前的sum值是什么
//如果sum < target 则说明值不够大,右边界需要右移,sum 需要增大
//所以 right 先++ 然后累加sum
if(right+1 < nums.length && sum < target){
right++;
sum = sum + nums[right];
}else {
//如果sum 已经 >= target了,则说明值大了,左边界需要右移
sum = sum - nums[left];
left++;
}
if(sum >= target){
//记录当前数组长度,和当前最小长度取一个最小值出来
minLength = Math.min(minLength, right - left + 1);
}
}
if(minLength == nums.length + 1){
return 0;
}else{
return minLength;
}
}
}