例:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组[4,3] 是该条件下的长度最小的子数组。
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
最直观的我们想到暴力法,但是这种方法时间复杂度高。
为了减少时间复杂度,我们消除两层for循环的方法就是设置两个指针【滑动窗口】。
此题中我们分别设置两个指针指向子数组的起始位置(low)和结束位置(high)。外层的循环来判断结束位置的指针。
如果从low到high的子数组之和大于等于target,就让low指针右移,在此过程中记录子数组的最小长度。
直到子数组之和小于target。让high指针右移。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int low=0;
int high=0;
int sum=0;
int result=Integer.MAX_VALUE;
int sublength;
while(high<nums.length){
sum+=nums[high];
high++;
while(sum>=target){
sublength=high-low;
result=result>sublength?sublength:result;
sum-=nums[low];
low++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}