209.minimumsizesubarraysum

咖啡中不塌缩的方糖 咖啡中不塌缩的方糖     2022-08-06     333

关键词:

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