当前位置: 首页 > 知识库问答 >
问题:

对数组O(N)中具有最大和的序列进行计数

庄智
2023-03-14

例如:{1,2,3,4,-3}输出将是4,因为1+2+3+4的和是最大和,该序列中有4个数字

我知道如何用O(n^2)的时间复杂度来做这件事,但不知道如何用O(n)的帮助?:)

共有1个答案

潘哲
2023-03-14

我认为可以这样迭代

MaxSum = 0;
CurrentSum = 0;
MaxLen = 0;
CurrentLen = 0;

Index = GetFirstPositiveValue(); 
// This function returns the first Index where Array[Index] > 0
// O(n) 

while (Index < Array.Length()) {
    // general loop to parse the whole array
    while (Array[Index] > 0 && Index < Array.Length()) {
        CurrentSum += Array[Index];
        CurrentLen++;
        Index++
    }
    // We computed a sum of positive integer, we store the values 
    // if it is higher than the current max
    if (CurrentSum > MaxSum) {
        MaxSum = CurrentSum;
        MaxLen = CurrentLen;
    }
    // We reset the current values only if we get to a negative sum
    while (Array[Index] < 0 && Index < Array.Length()) {
        CurrentSum += Array[Index];
        CurrentLen++;
        Index++;
    }
    //We encountered a positive value. We check if we need to reset the current sum
    if (CurrentSum < 0) {
        CurrentSum = 0;
        CurrentLen = 0;
    }
}
// At this point, MaxLen is what you want, and we only went through 
// the array once in the while loop.

从第一个积极的元素开始。如果每个元素都是负的,那么只需选择最高的,问题就结束了,这是一个1元素序列。

只要我们有正值,我们就会不断求和,所以我们有一个当前的最大值。当我们有一个负数时,我们检查当前的最大值是否高于存储的最大值。如果是这样,我们用新的值替换存储的最大值和序列长度。

如果当前和是正的,那么我们仍然可以用这个序列有一个最大和。如果它是负数,那么我们可以扔掉当前和,因为最大和不会包含它:

在{1,-2,3,4}中,3+4大于1-2+3+4

只要我们还没有遍历整个数组,我们就重新启动这个过程。只有当我们有一个产生负和的子序列时,我们才重置序列,只有当我们有一个更大的值时,我们才存储最大值。

 类似资料:
  • 现在我用不同的测试场景测试它,总是比Kadena的结果更好。我不相信这样的运气,但找不到我错过了什么。你能看看这是否是一个有效的解决方案吗? 更新代码的思想是只跟踪一个子数组,并添加到其尾数,当数字很低时,和成为尾数组后的负集开始。另外,一开始的负面项目被忽略了。子数组的头只是向前移动。每次sum看起来是maximal-maxsum并且限制被更新。

  • 问题内容: 我需要编写一个方法,该方法采用2d数组’int [] [] m’和值’val’,并检查val是否以 O(n)的复杂度 在数组 中,而n定义为行数和m必须平方 可以用作我的方法的参数的数组必须为此方法返回true: (如果它返回true,那么该数组是按要求的) 该数组返回TRUE: 如果位于数组中,则我的方法应返回true ,如下所示: 问题答案: 有可能。矩阵是大小为 nxn的 方阵。

  • 本文向大家介绍在C ++中对O(1)额外空间中数组中所有元素的频率和O(n)时间进行计数,包括了在C ++中对O(1)额外空间中数组中所有元素的频率和O(n)时间进行计数的使用技巧和注意事项,需要的朋友参考一下 给定一个范围从值1到n的元素数组。有些元素是重复的,而有些则缺失。目的是找到O(n)时间和O(1)额外空间中所有元素的频率。 输入值 输出结果 说明-最高元素是5,输出显示每个元素出现在数

  • 本文向大家介绍编写Golang程序以在数组(O(n))中查找具有给定总和的对,包括了编写Golang程序以在数组(O(n))中查找具有给定总和的对的使用技巧和注意事项,需要的朋友参考一下 例子 输入数组= [1、3、5、7、8、9],总和= 11 =>(3,8) 解决这个问题的方法 步骤1: 定义一个接受数组和sum的方法。 步骤2: 定义一个映射变量,输入map [int] int。 步骤3:将

  • null 在一个视频教程中,作者提到暴力方法是,阅读另一个答案,一个人认为是,另一个人认为是 强力是还是?更重要的是,您能说明您对蛮力方法执行了哪些分析以知道它是吗?

  • 问题内容: 我有一组数据点(可以稀疏化),它们需要与贝塞尔曲线拟合。我需要速度超过准确性,但合身度应该足够好以至于可以识别。我还在寻找一种我可以使用的算法,该算法没有过多地使用库(特别是NumPy)。 我已经阅读了几篇研究论文,但是都没有足够的细节来全面实施。有开源示例吗? 问题答案: 我有类似的问题,我从Graphics Gems(1990)中找到了有关Bezier曲线拟合的“一种自动拟合数字化