找到总和小于给定值的最大元素(连续)?

时间:2015-06-15 08:45:56

标签: arrays algorithm

所以,我有一系列所有正数自然数。我得到了一个门槛值。我必须找出其总和小于给定阈值的最大数量(连续)。

For example, 
IP: arr = {3,1,2,1}
Threshold = 5

O/P: 3

输入数组的最大大小可以是10 ^ 5。

基本上,我想到了一种算法,它计算原始数组子集中元素的数量,其总和将小于给定的阈值。但是,它会导致O(N ^ 2)的复杂性。有谁能建议更好的算法?我不是在寻找代码,只有算法/伪代码可以做得很好。谢谢!

4 个答案:

答案 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
   }
}

希望这可以帮助你...

如果您有任何其他问题,请与我们联系......