所以,我有一个包含所有正自然数的数组。给定一个阈值,我需要找出连续的数字之和小于给定阈值的最大数字数量。
For example,
IP: arr = {3,1,2,1}
Threshold = 5
O/P: 3
输入数组的最大长度可以是10^5。
基本上,我想到了一种算法,它计算原始数组子集中元素总和小于给定阈值的元素数量。但是,这将导致复杂度为O(N ^ 2)。有人能提供更好的算法吗?我不需要代码,只需要算法/伪代码即可。谢谢!
所以,我有一个包含所有正自然数的数组。给定一个阈值,我需要找出连续的数字之和小于给定阈值的最大数字数量。
For example,
IP: arr = {3,1,2,1}
Threshold = 5
O/P: 3
输入数组的最大长度可以是10^5。
基本上,我想到了一种算法,它计算原始数组子集中元素总和小于给定阈值的元素数量。但是,这将导致复杂度为O(N ^ 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)。我无法想到任何改进方法。
这可能有点粗糙,但应该能指向O(n)解决方案。
使用两个指针遍历列表,都从开头开始,我们称其中一个为lead(领导),另一个为trail(尾随),因为一个是领导,一个是尾随。
跟踪从trail到lead的总和;以及当前遇到的最长有效序列的长度。
当当前总和小于(或等于)阈值时,将lead指针向前移动,并通过添加它现在指向的值来调整总和。如果总和仍然小于(或等于)阈值,则从trail到lead的序列是可能的。
当当前总和大于阈值时,将trail指针向前移动。
继续直到lead指针到达末尾。
您需要填写详细信息并仔细实现它,但我认为它听起来很可靠。
请尝试以下...
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
}
}
6 1 2 3
,并且 threshold = 5
,你的代码将返回 1
,而实际上应该返回 2
。 - John Lui