n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead.
[2,3,1,2,4,3]
and s = 7
,
the subarray [4,3]
click to show more practice.
More practice:
If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).
1.方法一
left和right最初都指向0; right右移直到sum>=s;再右移left直到sum<s,之间更新res;重复上述两个过程。
时间复杂度O(n)。
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int left=0,right=0;
int len=nums.size();
int res=len+1;
int sum=0;
while(right<len){
while(right<len&&sum<s){
sum+=nums[right];
right++;
}
while(sum>=s){
sum-=nums[left];
left++;
res=min(res,right-left+1);
}
}
return res==len+1?0:res;
}
};
2,方法2
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int len=nums.size();
if(len==0) return 0;
vector<int> sums(len,0);
sums[0]=nums[0];
for(int i=1;i<len;i++){
sums[i]=sums[i-1]+nums[i];
}
int res=len+1;
for(int i=0;i<len;i++){
int end=helper(i,sums,s);
res=min(res,end-i+1);
}
return res==len+1?0:res;
}
private:
int helper(int start,vector<int>& sums,int s){
int left=start,right=sums.size()-1;
int offset=start==0?0:sums[start-1];
while(left<=right){
int mid=left+(right-left)/2;
int sum=sums[mid]-offset;
if(sum>=s){
right=mid-1;
}else{
left=mid+1;
}
}
return left;
}
};