【问题标题】:Find max sum of elements in array [duplicate]查找数组中元素的最大总和[重复]
【发布时间】:2012-09-09 13:00:06
【问题描述】:

编写一个程序,通过给定的整数值数组(包含负整数)找到数组中连续元素的最大和。

例子:

2、3、-6、-1、2、-1、6、4、-8、8

给予

11

我正在寻找比 O(N^2) 更快的解决方案。

【问题讨论】:

  • 1,2,5,6 不是连续的。如果你对可以取的子集没有限制,这就是Subset-Sum问题,也就是NP-Complete,但我觉得不是这样。
  • 抱歉造成误会。我在描述和示例中犯了一个错误。 :) 我都更新了。
  • 线性扫描可以解决这个问题。只需求和并与当前最大值进行比较,如果 sum en.wikipedia.org/wiki/Maximum_subarray_problem
  • @user1106337:它适用于任何情况——即使整个数组为负数(只需选择所有负数中最大的一个)。

标签: arrays algorithm


【解决方案1】:

我认为Kadane's Algorithm是你想要的

【讨论】:

  • 链接不再有效
【解决方案2】:

这实际上是我在大学学习的教科书问题(Mark Allen Weiss 的 Data Structures and Algorithms in C)......这是一个非常漂亮和优雅的解决方案,并且在 O(N) 中解决

int MaxSubsequenceSum(int A[])
{
    int sum = 0, maxSum = 0;

    for (int j = 0; j < A.Length; j++)
    {
        sum = sum + A[j];

        if (sum > maxSum)
            maxSum = sum ;
        else if (sum < 0)
            sum = 0;
    }
    return maxSum;
}

【讨论】:

  • 您的帖子已被匿名用户编辑并获得批准。您能否确认这些变化实际上是积极的?它似乎显着改变了逻辑。
  • 不,我没有批准它,它也没有显着改善答案。我认为这是为了积分
  • 由匿名用户完成,因此未授予代表。随意回滚。他们left a comment 告诉他们为什么这样做。
  • sum = maxSum + A[j]; 是错误的。我正在还原它(在 2、3、-6、-1、2 之后,应该是 2 的总和变成 7)
【解决方案3】:

您可以先对给定数组进行降序排序,然后将数组的前三个元素相加: sum=arr[0]+arr[1]+arr[2] 通过初始化sum=0 并打印总和。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多