得到前缀和数组之后,进行一次遍历,每遍历一个值,在它的后半部分利用二分法(所有数据都为正,前缀和数组有序递增)寻找第一个大于可以使区间和大于等于target的值(也可能找不到),没遍历一个,更新一次最小值即可。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n=nums.size();
int ans=999999;
int val;
int res;
vector<int> prefix(n);
prefix[0]=nums[0];
for(int i=1;i<n;i++){
prefix[i]=prefix[i-1]+nums[i];
}
for(int i=0;i<n;i++){
int left=i;
int right=n-1;
int p=0;
while(left<=right)
{
int mid=(left+right)/2;
if(i==0){
val=prefix[mid];
}
else{
val=prefix[mid]-prefix[i-1];
}
if(val<target){
left=mid+1;
}
else{
p=1;
res=mid;
right=mid-1;
}
}
if(p==1){
ans=min(ans,res-i+1);
}
}
if(ans!=999999){
return ans;
}
else{
return 0;
}
}
};