Medium
Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead.
For example, given the array [2,3,1,2,4,3]
and s = 7
,
the subarray [4,3]
has the minimal length under the problem constraint.
这道题看的答案,连暴力法也没有自主想出来。一开始让左右指针都为0, sum = nums[0], minLen = Integer.MAX_VALUE.当sum >= s时,说明现在的subArray的和过大,不一定是最短的满足sum >= s的子数组。此时就更新一下minLen, 然后删掉现在的subArray的第一个元素,也就是最靠左的元素,让left index递增,去寻找是否有更短的subArray的可能; 如果sum < s, 则向右移动right指针,sum += nums[right], 继续进行whiile循环。但是如果此时right已经达到最右,则需要注意这个时候已经不能再继续增加sum。 检查此时的minLen, 如果还是初始值,说明整个过程中我们都没有遇到sum >= s的情况,如果不是初始值了,说明遇到过sum >= s的情况,而我们在删掉left,右移left pointer的时候sum变小,变得sum < s了,这个时候我们直接返回记录到的minLen就好了。
class Solution {
public int minSubArrayLen(int s, int[] nums) {
if (nums == null || nums.length == 0){
return 0;
}
int l = 0;
int r = 0;
int sum = nums[0];
int minLen = Integer.MAX_VALUE;
while (r < nums.length){
if (sum >= s){
minLen = Math.min(minLen, r - l + 1);
sum -= nums[l];
l++;
} else {
if (r == nums.length - 1){
if (minLen == Integer.MAX_VALUE){
minLen = 0;
}
break;
}
r++;
sum += nums[r];
}
}
return minLen;
}
}