题目要求我们在一个数组中找到一个最短的连续子数组,满足子数组中所有元素之和大于target,面对这种题目首先容易想到从长度为1的子数组开始遍历,一直试到有满足条件的子数组出现。而暴力的解法并不是我们想要的。
因为是要找子数组,而且要找长度最小的,因此我们需要一个指标来表示子数组的大小和位置,所以我们定义两个边界分别为start和end,left代表子数组的开始下标,right是子数组的结束下标,从而这个left和right就构成了一个窗口,这个窗口的大小随着right和left的值的变化而变化,又因为我们要找的是最小的,所以在开始的时候我们把left和right定在同一个下标,这样窗口长度则为1,若不符合条件,就让right向右移动,在判断是否满足条件,满足条件后,为了验证当前窗口是否是最小长度,我们再让left也向右移动,让窗口减小,再次判断是否满足,于此类推,同时用一个size的参数记录当前遍历发现的满足条件的最短的子数组的大小,最后用来返回。
代码如下:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int start=0;
int end=0;
int sum=nums[0];
int size=0;
while(start<=end&&end<nums.length)
{
if(sum<target)
{
end++;
if(end<nums.length)
sum+=nums[end];
}
else if(sum>=target)
{
if(size!=0)
{
if(size==1)
{
return size;
}
size=Math.min(size,end-start+1);
start++;
sum-=nums[start-1];
}
else if(size==0)
{
size=end-start+1;
start++;
sum-=nums[start-1];
}
}
}
return size;
}
}