给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
示例:输入: s = 7, nums = [2,3,1,2,4,3] 输出: 2 解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
使用滑动窗口,可以在O(n)时间内解决:
1、当窗口内数组和<s,直接扩大窗口
2、当窗口内数组和>=s,这时候缩小窗口,如果已经缩小至1个,这时候需要扩大
public int minSubArrayLen(int s, int[] nums) {
if (nums.length == 0) {
return 0;
}
int sum = nums[0];
int left = 0;
int right = 0;
int len = Integer.MAX_VALUE;
while (right < nums.length) {
//先判断当前窗口
if (sum >= s) {
len = Math.min(len, right - left + 1);
//缩小窗口
if (left < right) {
sum -= nums[left];
left++;
} else {
//扩大窗口
right++;
}
} else {
right++;
if(right < nums.length){
sum += nums[right];
}
}
}
return len == Integer.MAX_VALUE ? 0 : len;
}