给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其总和大于等于
target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。示例 1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组[4,3]
是该条件下的长度最小的子数组。示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum=0;
int i = 0;
int res = Integer.MAX_VALUE;
int test=0;
for(int k= 0;k<nums.length;k++)
{
test+=nums[k];
}
if (test<target)
res = 0;
for(int j= 0;j<nums.length;j++)
{
sum+=nums[j];
while(sum>=target)
{
int val = j-i+1;
res = Math.min(res,val);
sum = sum - nums[i];
i++;
}
}
return res;
}
}
这道题用爽直针法一个是start(i),一个是end(j),需要注意的两给点是for循环中的变量是end指针,每次end往后移动确定满足要求的最大窗口,再移动start查找最小窗口,这种方法巧妙地没有把所有的情况列出来(像暴力解法那样)但是包含了所有满足要求的最短长度数组,虽然没有包含所有满足要求的数组,但不影响结果。