长度最小的子数组
1、给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
2、
/**
* 长度最小的子数组:滑动窗口[left...right]
* 时间复杂度O(n)
* 空间复杂度O(1)
* @param s
* @param nums
* @return
*/
public int minSubArrayLen(int s, int[] nums) {
//nums[left...right]为滑动窗口
int left=0;
int right =-1;
//当前滑动窗口(子数组)的和
int sum = 0;
//返回的最小子数组的长度
int res = nums.length+1;
while (left<nums.length){
//存在滑动窗口
if(right+1 <nums.length && sum <s){
//将窗口的右边界向外拓展一个
right ++;
sum += nums[right];
}
else{
//当前sum< = s时
//窗口的左边界向右行进一位
sum -=nums[left];
left ++;
}
if(sum >=s){
res = Math.min(res,right-left+1);
}
}
//没有更新过res,全部值加起来都小于s
if(res == nums.length+1){
return 0;
}
return res;
}