zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ApacheCN JavaScript 译文集 20211122 更新
    ApacheCN jQuery 译文集 20211121 更新
    ApacheCN 大数据译文集(二) 20211206 更新
    我这里一直空荡荡的,还占着博客园的位置,真是不好意思
    2009年最后一天
    学习petshop的朋友。这里有一些讲坐下载
    Repeater控件中如何做编辑和删除功能
    可以让你少奋斗十年的工作经验
    GridView自定义分页,模仿GridView的自动分页功能
    从内容面访问母版页中的控件或属性
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8746808.html
Copyright © 2011-2022 走看看