【问题标题】:Find an idx with the maximum sum找到总和最大的 idx
【发布时间】:2021-05-26 16:39:49
【问题描述】:

所以我需要编写一个递归程序,它返回一个索引,以便直到它的元素的总和最大。 例如列表[1,-5,9,-12,3,3,3,2],元素总和最大的idx为2。 另一个例子: 列表[1,-5,9,7],在这种情况下将返回的idx 是3。 如果有人知道该怎么做,或者知道有人在论坛中提出的类似问题,那将会很有帮助。谢谢

【问题讨论】:

  • StackOverflow 不是代码编写服务。请显示您尝试过的代码,并描述您遇到问题的地方。
  • 这能回答你的问题吗? Python Finding Index of Maximum in List
  • 这是Maximum Subsequence Sum Problem 的一个受限实例,其中有一些解决方案。一个分而治之的递归版本,你可以找到here,虽然是伪代码而不是python。那里的讨论应该让您了解如何针对受限情况提出自己的解决方案。

标签: python recursion


【解决方案1】:

您需要为总和输入一个较低的估计值,这就是我使用 min(list_of_numbers)*100 的原因。您可能需要修改它,如果您可以使用 numpy,我会建议将该值替换为 -np.inf

list_of_numbers = [1,-5,9,-12,3,3,3,2]

def maxSumId(list_of_numbers):
    id_max = 0
    sumVal = 0
    maxVal = min(list_of_numbers)*100
    for i,number in enumerate(list_of_numbers):
        sumVal += number
        if sumVal > maxVal:
            maxVal = sumVal
            id_max = i
    return id_max
    
maxSumId(list_of_numbers)

【讨论】:

  • 这给出了正确的解决方案,但不是递归的。
【解决方案2】:

您的递归可以轻松计算累积和,但它需要携带最大值及其索引才能返回索引而不是值。

# L:list, i:current index, s:current sum, mi:max sum index, ms:max sum value

def iMaxSum(L,i=0,s=0,mi=0,ms=None):
    if i>=len(L): return mi           # end of list return max index
    if ms is None or L[i]+s>ms:       # track max sum and its index 
        ms,mi = s + L[i],i
    return iMaxSum(L,i+1,s+L[i],mi,ms) # next item,index,sum

    
print(iMaxSum([1,-5,9,-12,3,3,3,2])) # 2
print(iMaxSum([1,-5,9,7]))           # 3

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 2013-11-12
    • 2012-11-08
    • 2022-12-12
    • 2014-01-07
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多