给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-size-subarray-sum
暴力解法
可以解一部分的解,但是有一部分大型数据会导致时间超时
思路是利用两个循环,用sum记录元素之和,一旦发现sum>=target,就进行对比,如果长度count小于记录的最小长度result,则更新result。然后跳出内层循环(满足sum大于target的最小长度已经找到,再进行此层循环已无意义)
代码如下:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int len=nums.size(),sum,count=0,result=INT32_MAX;
for(int i=0;i<len;i++){
sum=0;
for(int j=i;j<len;j++){
sum+=nums[j];
if(sum>=target){
count=j-i+1;
result=result>count?count:result;
break;
}
}
}
if(result==INT32_MAX)return 0;
return result;
}
};
滑动窗口
示例图:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int len=nums.size(),sum=0,count=0,result=INT32_MAX,j=0;//j是起始位置
for(int i=0;i<len;i++){//i作为终止位置
sum+=nums[i];
while(sum>=target){//当sum大于等于target时才进入循环
count=i-j+1;
sum-=nums[j++];
result=result<count?result:count;
}
}
if(result==INT32_MAX)return 0;
return result;
}
};