209. Minimum Size Subarray Sum
Given an array of 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.
For example, given the array [2,3,1,2,4,3]
and s = 7
,
the subarray [4,3]
has the minimal length under the problem constraint.
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).
public int MinSubArrayLen(int s, int[] nums) { int left =0; int right =0; int res = nums.Count()+1; int sum =0; int count =0; while(right <= nums.Count()) { if(sum>=s) { res = Math.Min(res,right-left); sum -=nums[left++]; } else if(right < nums.Count()) { sum += nums[right]; right++; } else right++; } return (res == nums.Count()+1)?0:res; }
另一种解法是综合DP和binary search
public int MinSubArrayLen(int s, int[] nums) { int size = nums.Count(); var sums = new int[size+1]; sums[0] =0; int res = size+1; for(int i =1;i<=size;i++) { sums[i] = sums[i-1]+nums[i-1]; } for(int i=0;i<=size;i++) { int right = GetRightPoint(sums,sums[i]+s,i+1); if(right<=size) { res = Math.Min(res,right-i); } } return res==size+1?0:res; } private int GetRightPoint(int[] sums, int target, int leftPoint) { int left = leftPoint; int right = sums.Count()-1; while(left <= right) { int mid = left + (right - left)/2; if(sums[mid]>=target) right = mid-1; else left = mid+1; } return left; }