给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
------------------------------------------------------------------------------------------------------------------------------
1.暴力破解,经过两次for循环即可,但第二次循环在找到目标之后要记得bresk,否则会超时;
2.滑动窗口,也可以理解为双指针
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int first=0;//first滑动窗口前端last滑动窗口后端,在从左到右的遍历中,是last先遍历数组
int sum=0;
int result = INT32_MAX;
for(int last=0;last<nums.size();++last)
{
sum+=nums[last];
while(sum>=target)
{
int length=last-first+1;
result=result<length?result:length;
sum-=nums[first++];//滑动窗口实现的核心,将sum减去nums[first],并且将first++,也即实现了窗口向后移,缩短窗口长度看是否还符合sum>=target
}
}
return result<INT32_MAX?result:0;
}
};
在for中last遍历了一遍数组,然后在while中first又遍历了一遍,所以时间复杂度是2n。也即n。