zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    BZOJ1106[POI2007]立方体大作战tet
    BZOJ4407 于神之怒加强版
    BZOJ1103: [POI2007]大都市meg
    BZOJ3170: [Tjoi2013]松鼠聚会
    Luogu 2912 [USACO08OCT]牧场散步Pasture Walking
    BZOJ1251 序列终结者- splay
    BZOJ1699: [Usaco2007 Jan]Balanced Lineup排队
    BZOJ 1005[HNOI2008]明明的烦恼
    二叉树
    [CODEVS1130]数字反转
  • 原文地址:https://www.cnblogs.com/renyualbert/p/5907752.html
Copyright © 2011-2022 走看看