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;
}
答案 0 :(得分:0)
这是解决问题的最直接的方法-尽管这并不是解决问题的最有效算法。
您需要一个数组中最少的元素总数加起来大于给定数量的元素。我们将调用此操作所需的元素数称为 s 。然后,当我们采用所需的少数几个元素来超过您的最小数量时, s 的最小值就会出现。
因此,最直接的解决方案是将数组从最大到最小排序,然后循环遍历元素,直到超过最小数量为止。然后,您将从停止处的索引中确定 s 。
此算法的运行时复杂度对于排序部分为O(nlogn),然后对于第二部分为O(n)。因此,该算法的运行时间复杂度为O(nlogn)+ o(n)= O(nlogn)。