题目:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
题解:
双指针法:左右指针中间的数是连续的,因而每次移动左右指针中的一个,时间复杂度为O(N),当目前的和小于s时,右指针右移,当和大于或等于s时,左指针左移。
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
//为了p1和p2能指向n+1表示[0,n+1)区间,压入一个0,0不会对答案造成干扰
nums.push_back(0);
int p1=0,p2=0;
int sum=0,ans=INT_MAX;
int n=nums.size();
while(p1!=n&&p2!=n)
{
if(sum<s)
{
sum+=nums[p2];
p2++;
}else
{
ans=min(ans,p2-p1);
sum-=nums[p1];
p1++;
}
}
return ans==INT_MAX?0:ans;
}
};
二分法:O(NlogN)埋坑待填