目录
长度最小的子数组
描述
给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 ,并返回其长度。
如果不存在符合条件的子数组,返回 0 。
示例 1
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2
输入:target = 4, nums = [1,4,4] 输出:1
示例 3
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
提示
方法:滑动窗口
滑动窗口其实也是双指针,感觉数组好多题都可以用双指针做。
我们定义left和right指针,left指向当前窗口的左边界,right指向当前窗口的右边界。
我们首先让right指针右移一位,然后判断当前窗口和是否大于target,如果大于的话不断让left指针左移,找到right处于当前位置满足条件的最短长度,然后我们继续让right指针右移直到数组末尾。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left=0,right=0;//滑动窗口,左指针指向窗口的左边界,右指针指向窗口的右边界
int sum=0,minlen=Integer.MAX_VALUE;//记录当前滑动窗口的元素和,以及最短长度
while(right<nums.length){//当右指针没有达到数组的右边界时
sum+=nums[right];//更新sum的大小
while (sum>=target){
minlen=Math.min(minlen,right-left+1);//将当前区间的长度和最短长度比较,更新最短长度
sum-=nums[left];//左指针不断左移,找到以当前元素结尾的最短长度
left++;
}
right++;//右指针右移
}
return minlen==Integer.MAX_VALUE?0:minlen;
}
}