滑动窗口的左边 left
滑动窗口的右边 right
滑动窗口的数值 即 滑动窗口内元素数值之和
滑动窗口的大小 right - left + 1
滑动窗口的使用
right先动,遍历数组,控制滑动窗口的移动
同时 sum 计算滑动窗口内的数值的大小
当 sum 大于给定的数值 target 的时候,这时候要缩减滑动窗口内的数值的大小
比较 result 大小和 len 的大小,确定 result 的长度是最小的连续子数组的长度
当 sum 大于 target 的时候,就要移动 left
left 如何移动?
通过删除sum中 left 处的元素
同时left++,来移动left位置,这时候就完成了对滑动窗口的大小和数值的缩小
class Solution {
public int minSubArrayLen(int target, int[] nums) {
// 滑动窗口的左边
int left = 0;
// 滑动窗口的数值
int sum = 0;
int result = Integer.MAX_VALUE;
// 通过 right 来遍历数组
for(int right = 0; right < nums.length; right++) {
// right 往右移动, 滑动窗口内数值变大
sum += nums[right];
// 当滑动窗口内的数值大过 target 的时候,开始移动 left 来缩减数值
while(sum >= target) {
// 记录滑动窗口长度
int len = right - left + 1;
// 当滑动窗口中的大小大于 result 的时候,将其替代
result = result < len ? result : len;
// 减去滑动窗口最左边的元素
sum -= nums[left++];
}
}
// 当整个数组都遍历完毕之后,来比较是否 result 是否还是原来那个值,是的话说明数值之和没有超过 s,即不存在符合条件的子数组
return result == Integer.MAX_VALUE ? 0 : result;
}
}