【问题标题】:Finding the maximum elements (consecutive) whose sum is less than a given value?找到总和小于给定值的最大元素(连续)?
【发布时间】:2015-06-15 08:45:55
【问题描述】:

所以,我有一个由所有正自然数组成的数组。我被赋予了一个阈值。我必须找出总和小于给定阈值的数字的最大计数(连续)。

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

O/P: 3

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

基本上,我想到了一种算法,它计算原始数组子集中元素的计数,其总和将小于给定阈值。但是,它会导致 O(N^2) 的复杂度。任何人都可以提出更好的算法吗?我不是在寻找代码,只有算法/伪代码就可以了。谢谢!

【问题讨论】:

标签: arrays algorithm


【解决方案1】:
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)。我想不出有什么改进。

【讨论】:

  • 此解决方案不正确。它会找到
【解决方案2】:

这会有点粗糙,但应该指出一个 O(n) 解决方案

用两个指针遍历列表,都从头开始,我们称一个为前导,另一个为尾迹,因为一个前导和一个尾迹。

跟踪从跟踪到领先的总和;以及当前遇到的最长有效序列的长度。

当当前总和小于(或等于)阈值时,推进前导指针并通过添加它现在指向的值来调整总和。如果总和仍然小于(或等于)阈值,则从线索到线索的顺序是可能的。

当当前总和大于阈值时,前进轨迹指针。

继续直到前导指针到达终点。

您需要填写详细信息并仔细实施,但对我来说似乎已经足够了。

【讨论】:

  • 我实现了你所说的,并且我已经编辑了我的原始帖子以包含代码。但是,如果阈值非常大(8 位数字)并且数组中的元素数量为100000,那么它仍然给出了超出时间限制。你能告诉我如何进一步优化我的代码吗?
  • 不要重复计算总和。利用 Ai 到 Aj 的总和等于 Ai 到 Aj-1 + A[j]的总和这一事实
【解决方案3】:

我会尝试以下方法:

  • 首先对数组开头的元素求和,直到达到阈值。将此子数组保存为临时结果。
  • 然后从子数组的开头删除一个元素,并尝试从另一侧添加新元素,直到再次达到阈值。如果结果较大,请将以下结果替换为新结果。
  • 继续直到数组结束。

【讨论】:

  • 这听起来与我们几乎在同一时间发布的解决方案一模一样。这让我对他们更有信心。
【解决方案4】:

试试下面...

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 3threshold = 5,则您的代码将在应该返回 2 时返回 1
  • 对于 6 1 2 3 和阈值 5,最大计数是 6 对吗?...怎么会是 7
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 2018-05-03
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2022-10-12
  • 1970-01-01
相关资源
最近更新 更多