题目地址:
给定一个正整数数组,再给定一个正数s,求数组的最短子数组的和大于等于s,返回其长度。
思路是,开快慢双指针i和j,并开一个变量来维护[i:j]这个区间内的和(包括端点)。如果这个区间和大于等于s,则更新最短长度,并让i后移,同时区间和减去A[i];如果这个区间和小于s,则右移j。代码如下:
public class Solution {
public int minSubArrayLen(int s, int[] nums) {
int res = nums.length + 1, sum = 0;
for (int i = 0, j = 0; j < nums.length; ) {
// sum维护nums[i, ..., j]的和
sum += nums[j];
// 如果和大于等于s,说明区间[i : j]满足条件,更新长度,并让i后移
while (sum >= s) {
res = Math.min(res, j - i + 1);
sum -= nums[i];
i++;
}
// 上面的循环已经把以nums[j]结尾的满足条件的子数组都算过了,则让j后移
j++;
}
// res未得到更新,则说明不存在解,返回0;否则返回res
return res == nums.length + 1 ? 0 : res;
}
}
时间复杂度O(n),空间O(1)。