209 Minimum Size Subarray Sum 大于给定和最短子数组

给定一个含有 n 个正整数的数组和一个正整数 s , 找到一个最小的连续子数组的长度,使得这个子数组的数字和 ≥  s 。如果不存在符合条件的子数组,返回 0。
举个例子,给定数组 [2,3,1,2,4,3] 和 s = 7,
子数组 [4,3]为符合问题要求的最小长度。
更多练习:
如果你找到了O(n) 解法, 请尝试另一个时间复杂度为O(n log n)的解法。

详见:https://leetcode.com/problems/minimum-size-subarray-sum/description/

Java实现:

方法一:时间复杂度O(nlogn)

class Solution {
    public int minSubArrayLen(int s, int[] nums){
        int[] sums = new int[nums.length + 1];
        
        for (int i = 1; i < sums.length; i++){ 
            sums[i] = sums[i - 1] + nums[i - 1];
        }
        int minLen = Integer.MAX_VALUE;
        
        for (int i = 0; i < sums.length; i++){
            int end = binarySearch(i + 1, sums.length - 1, sums[i] + s, sums); 
            if (end == sums.length){
                break;
            }
            if (end - i < minLen) {
                minLen = end - i;
            }
        }
        return minLen == Integer.MAX_VALUE ? 0 : minLen;
    }
    
    public int binarySearch(int l, int h, int key, int[] sums){
        while (l <= h){
           int m = (l + h)>>1;
           if (sums[m] >= key)
               h = m - 1;
           else 
               l = m + 1;
           
        }
        return l;
    }
}

参考:https://www.cnblogs.com/jimmycheng/p/7477562.html

方法二:时间复杂度O(n)

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        int n=nums.length;
        if(n==0||nums==null){
            return 0;
        }
        int left=0;
        int right=0;
        int sum=0;
        int res=Integer.MAX_VALUE;
        while(right<n){
            while(sum<s&&right<n){
                sum+=nums[right++];
            }
            while(sum>=s){
                res=Math.min(res,right-left);
                sum-=nums[left++];
            }
        }
        return res>n?0:res;
    }
}

C++实现:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int n=nums.size();
        if(n==0||nums.empty())
        {
            return 0;
        }
        int left=0,right=0,sum=0,res=INT_MAX;
        while(right<n)
        {
            while(sum<s&&right<n)
            {
                sum+=nums[right++];
            }
            while(sum>=s)
            {
                res=min(res,right-left);
                sum-=nums[left++];
            }
        }
        return res>n?0:res;
    }
};

 参考:https://www.cnblogs.com/grandyang/p/4501934.html

原文地址:https://www.cnblogs.com/xidian2014/p/8746808.html