滑动窗口:滑动窗口值小于目标值,窗口右端移动,滑动窗口值大于目标值,窗口左端移动。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
// 滑动窗口左端
int left = 0;
// 滑动窗口右端
int right = 0;
// 滑动窗口数值之和
int sum = 0;
// 子数组的最小长度
int minLen = Integer.MAX_VALUE;
int len = nums.length;
// 滑动窗口右端不得超过数组长度
while (right<len) {
sum = sum + nums[right];
// 滑动窗口和大于目标值时
while (sum>=target) {
// 注意:先计算子数组长度再将滑动窗口左端左移,否则存在边界问题:15 [1,2,3,4,5]
if (sum >= target) {
minLen = Math.min(minLen, right-left+1);
}
sum = sum - nums[left++];
}
// 每次循环滑动窗口右端右移一位
right++;
}
if (minLen == Integer.MAX_VALUE) {
return 0;
}
return minLen;
}
}