原题链接:力扣
题目描述:
给定一个含有n个正整数的数组和一个正整数target,找出该数组中满足其和>=target 的长度最小的连续子数组[nums1,nums1+1,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。
示例:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
方法:
1、暴力法,两层for循环寻找最短的连续子数组,用例超出时间限制
2、滑动窗口法,right为窗口结束处
Java版本答案:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//暴力法,两层for循环寻找最短的连续子数组
//用例超出时间限制
// int result = Integer.MAX_VALUE;
// int sum = 0;
// int subLength = 0;
// for(int i = 0;i < nums.length;i++){
// sum = 0;
// for(int j = i;j < nums.length;j++){
// sum += nums[j];
// if(sum >= target){
// subLength = j - i + 1;
// result = subLength < result ? subLength : result;
// break;
// }
// }
// }
// return result == Integer.MAX_VALUE ? 0 : result;
//滑动窗口法,right为窗口结束处
int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
int subLength = 0;
for(int right = 0;right < nums.length;right++){
sum += nums[right];
while(sum >= target){
// subLength = right - left + 1;
// result = subLength < result ? subLength : result;
// sum -= nums[left];
// left ++;
//优化前4行
result = Math.min(result,right - left + 1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}