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;
  }
}; 










