最小大小子数组

时间:2018-08-16 02:55:46

标签: java

https://www.programcreek.com/2014/05/leetcode-minimum-size-subarray-sum-java/

我不了解此代码的工作方式。如挑战中所述,目的是

  

给定一个n个正整数和一个正整数s的数组,找到总和≥s的子数组的最小长度。如果没有,则返回0。

代码如下:

public int minSubArrayLen(int s, int[] nums) {
if(nums==null || nums.length==1)
    return 0;

int result = nums.length;

int start=0;
int sum=0;
int i=0;
boolean exists = false;

while(i<=nums.length){
    if(sum>=s){
        exists=true; //mark if there exists such a subarray 
        if(start==i-1){
            return 1;
        }

        result = Math.min(result, i-start);
        sum=sum-nums[start];
        start++;

    }else{
        if(i==nums.length)
            break;
        sum = sum+nums[i];
        i++;    
    }
}

if(exists)
    return result;
else
    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是解决问题的最直接的方法-尽管这并不是解决问题的最有效算法。

您需要一个数组中最少的元素总数加起来大于给定数量的元素。我们将调用此操作所需的元素数称为 s 。然后,当我们采用所需的少数几个元素来超过您的最小数量时, s 的最小值就会出现。

因此,最直接的解决方案是将数组从最大到最小排序,然后循环遍历元素,直到超过最小数量为止。然后,您将从停止处的索引中确定 s

此算法的运行时复杂度对于排序部分为O(nlogn),然后对于第二部分为O(n)。因此,该算法的运行时间复杂度为O(nlogn)+ o(n)= O(nlogn)。