解法一:
题目要求的是连续的子数组,我们可以维护一个满足条件的最小子数组。枚举数组的右边界,要缩小的话就是左边界右移,那么就可以用队列来维护这么一个数组,每次更新最小值。(其实不需要什么数据结构仅仅使用双指针就够了)
时间复杂度O(n)
解法二:
同样是枚举右边界,然后二分前缀数组寻找左边界。
时间复杂度O(n log(n))
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int pos=0,sum=0,res=1e9;
queue<int>q;
while(pos!=nums.size()){
q.push(nums[pos]);
sum+=nums[pos];
while(sum-q.front()>=target)
{
sum-=q.front();
q.pop();
}
if(sum>=target)
res=min(res,static_cast<int>(q.size()));
++pos;
}
return res==1e9 ? 0:res;
}
};