【问题标题】:finding contiguous Subset with Largest Sum找到具有最大和的连续子集
【发布时间】:2014-02-11 00:32:06
【问题描述】:
def max_sublist(x):
 max1 = 0
 max2 = 0
 result = []
 for i in x:
     max2 = max(0, max2 + i)
     max1 = max(max1, max2)

 print result

我想添加元素直到具有最大总和的元素。如何只将谁的元素添加到结果中。

例如。如果x = [4, -1, 5, 6, -13, 2] 那么结果应该是[4, -1, 5, 6]

【问题讨论】:

  • 那么您是否总是希望子集从列表的开头或列表开始,还是可以从中间的某个位置开始?
  • 不太清楚你的算法打算是什么,但我很确定它不会起作用。您似乎没有处理最佳连续子集不是从列表开头开始的情况。

标签: python algorithm python-2.7


【解决方案1】:

这是优化中的经典问题,称为maximum subarray problem。这是O(n) 中一种可能的动态编程解决方案,使用Kadane's algorithm

def max_val_contiguous_subsequence_idxs(seq):
    i = thisSum = maxSum = 0
    startIdx, endIdx = 0, -1
    for j in xrange(len(seq)):
        thisSum += seq[j]
        if thisSum > maxSum:
            maxSum = thisSum
            startIdx = i
            endIdx   = j
        elif thisSum < 0:
            thisSum = 0
            i = j + 1
    return (maxSum, startIdx, endIdx)

上面将在一次传递中返回一个元组,其中包含最大和、子序列的起始索引和结束索引。例如,使用问题中的示例输入:

lst = [4, -1, 5, 6, -13, 2]
maxSum, startIdx, endIdx = max_val_contiguous_subsequence_idxs(lst)

maxSum
=> 14
lst[startIdx:endIdx+1]
=> [4, -1, 5, 6]

请注意,维基百科页面中显示的实现(看起来很像您的目标解决方案)仅给出最大总和,但与我的解决方案不同,它们没有告诉您如何在数组中查找子序列索引.

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 2015-07-27
    • 2010-09-17
    • 2013-09-13
    • 2014-10-31
    • 2012-08-23
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多