标签:
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.
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; }
209. Minimum Size Subarray Sum
标签:
原文地址:http://www.cnblogs.com/renyualbert/p/5907752.html