算法
(滑动窗口) $O(n)$
定义两个指针$left$和$right$,分别记录子数组的左右的边界位置。
- 让$right$向右移,直到子数组和大于等于给定值或者$right$达到数组末尾;
- 更新最短距离,将$left$向右移一位,$sum$减去移去的值;
- 重复1,2步骤,直到$right$到达末尾,且$left$到达临界位置。
Java 代码
class Solution {
public int minSubArrayLen(int s, int[] nums) {
int l = 0, r = -1; // nums[l...r]为我们的窗口滑动
int sum = 0;
int res = nums.length + 1;
while (l < nums.length) { // 窗口的左边界在数组范围内,则循环继续
if (r + 1 < nums.length && sum < s) {
r++;
sum += nums[r];
}
else { // r已经到头或者sum>=s
sum -= nums[l];
l++;
}
if (sum >= s) res = (r - l + 1) < res ? r - l + 1 : res;
}
return res == nums.length + 1 ? 0 : res;
}
}