这道题有很多解法,但按照我的进度,我只会暴力和滑动窗口,这里重点解析滑动窗口
Java版本:
class Solution {
public int minSubArrayLen(int s, int[] nums) {
int left = 0;
int right = 0; // 右指针指向下一个将要加入窗口的元素
int sum = 0;
int result = Integer.MAX_VALUE;
// 右指针遍历整个数组
while (right < nums.length) {
// 将当前右指针指向的元素加入窗口,然后右指针右移
sum += nums[right++];
// 当窗口内元素和大于等于目标值时,尝试收缩左边界
while(sum >= s) {
// 窗口区间为 [left, right),长度为 right - left
result = Math.min(result, right - left);
// 移除左边界元素,左指针右移
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
1.什么时候右移右指针?
答:当现在的window与target不一致时,向右移,但在第一个while中可以执行一次right++
这样保证了窗口是左开右闭。(相当于窗口内的数据范围是[le,ri)部分的数据
2.什么时候收缩,收缩几次?
答:当右移满足时,开始收缩,但收缩过程正式寻找最优解的过程,在这里可能更改result