解析

两种解法,双指针,和二分查找

代码

双指针

public int minSubArrayLen(int s, int[] nums) {
        if(nums.length==0) return 0;
int min=Integer.MAX_VALUE;
        int left=0;
        int right=0;
        int sum=nums[0];
        while(right<nums.length)
        {
            if(sum<s)
            {
                right++;
                if(right>=nums.length) return min==Integer.MAX_VALUE?0:min;
                sum+=nums[right];
            }else if(sum>=s)
            {
                min=Math.min(min,right-left+1);
                sum-=nums[left];
                left++;
            }
        }
        return 0;
}

二分查找

public int minSubArrayLen(int s, int[] nums) {
        if(nums.length==0) return 0;
        int min=Integer.MAX_VALUE;
        int[] sums=new int[nums.length];
        sums[0]=nums[0];
        for(int i=1;i<sums.length;i++)
        {
            sums[i]=sums[i-1]+nums[i];
        }
        for(int i=0;i<nums.length-1;i++)
        {
            if(nums[i]>=s) return 1;
            int val=s+sums[i]-nums[i];
            int start=i+1;
            int end=sums.length-1;
            int res=Integer.MAX_VALUE;
            while(start<=end)
            {
                int mid=(start+end)/2;
                if(sums[mid]>=val)
                {
                    res=mid;
                    end=mid-1;
                }else
                {
                    start=mid+1;
                }
            }
            if(res!=Integer.MAX_VALUE) min=Math.min(min,res-i+1);
        }
        return min==Integer.MAX_VALUE?0:min;
    }