1.题目描述
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其总和大于等于
target
的长度最小的子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度 。如果不存在符合条件的子数组,返回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提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
进阶:
- 如果你已经实现
O(n)
时间复杂度的解法, 请尝试设计一个O(n log(n))
时间复杂度的解法。
2.解题思路
滑动窗口的模式
为了能够遍历整个数组,需要定义end(范围0~数组长度)
start从0开始,当start~end的和大于target后,逐步收缩区间让start后移,这样就能找到以end结束且符合要求的最短的区间了
3.代码
import java.util.Scanner;
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len = nums.length;
int start = 0,end = 0, result = len+1, sum = 0;
if(len ==0){
return 0;
}
for( end = 0;end<len;end++){
sum+= nums[end];
while(sum>=target){
result = Math.min(result, end - start+1);
sum -= nums[start];
start++;
}
}
if(result == len +1){
return 0;
}
return result;
}
}