首页 > 代码库 > 209. Minimum Size Subarray Sum

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.

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).

 
 
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