所以,我有一系列所有正数自然数。我得到了一个门槛值。我必须找出其总和小于给定阈值的最大数量(连续)。
For example,
IP: arr = {3,1,2,1}
Threshold = 5
O/P: 3
输入数组的最大大小可以是10 ^ 5。
基本上,我想到了一种算法,它计算原始数组子集中元素的数量,其总和将小于给定的阈值。但是,它会导致O(N ^ 2)的复杂性。有谁能建议更好的算法?我不是在寻找代码,只有算法/伪代码可以做得很好。谢谢!
答案 0 :(得分:2)
public static int maximumSum(int[] array, int t){
int maxSum = 0;
int curSum = 0;
int start = 0;
int end = 0;
while(start < array.length){
if(curSum > maxSum && curSum <= t){
maxSum = curSum;
}
if(curSum <= t && end < array.length){
curSum += array[end];
end += 1;
}
else{
curSum -= array[start];
start+= 1;
}
}
return maxSum;
}
此代码的复杂性为O(2 * n),基本上为O(n)。我无法想到对此有任何改进。
答案 1 :(得分:1)
这有点粗糙,但应该指向O(n)解决方案
使用两个指针遍历列表,从开始开始,我们将一个引导,另一个跟踪,因为一个引导和一个跟踪。
跟踪从追踪到领先的总和;以及当前遇到的最长有效序列的长度。
当前总和小于(或等于)阈值时,推进前导指针并通过添加它现在指向的值来调整总和。如果总和仍然小于(或等于)阈值,那么从跟踪到引导的序列是可能的。
当前总和大于阈值时,推进路径指针。
继续,直到指针到达结尾。
你需要填写细节并仔细实施,但这对我来说似乎已经足够了。
答案 2 :(得分:1)
我会尝试以下内容:
答案 3 :(得分:0)
尝试以下...
public int maximumElem(int[] array,int threshold)
{
int sum = 0;
for(int i=0;i<array.length;i++)
{
sum = sum + array[i]; //sum the values at each index
if(sum >= threshold) //check condition
return (i+1); // if sum is reaching the threshold then return the index
}
}
希望这可以帮助你...
如果您有任何其他问题,请与我们联系......