【问题标题】:Returning wrong maximum sum sub array(kadane's algorithm), but correct maximum sum [duplicate]返回错误的最大和子数组(kadane的算法),但正确的最大和[重复]
【发布时间】:2015-07-15 09:05:40
【问题描述】:

下面是我在 Python 2.7 中用于返回最大子数组的 kadane 算法的代码。虽然,对于给定的示例列表,我得到了正确的最大总和(MSS 变量), 它返回错误的子数组。有人可以解释一下为什么吗?

A = [-2,1,-3,4,-1,2,1,-5,4]
M = max(A)
L = len(A)
if(M < 0):
   print M
ans = []
subans = []
MSS,subsum,i = 0,0,0

while(i<L):
   subans.append(A[i])
   subsum = sum(subans)
   if(subsum<0):
       subans=[]
       i+=1
   else:
       if(subsum>MSS):
           MSS=subsum
           ans=subans
           i+=1
       else:
           i+=1
print ans

【问题讨论】:

  • 你能提供预期的输出吗
  • 预期输出 [4,-1,2,1] 且 MSS =6 但是我得到 [4,-1,2,1,-5,4]
  • 当你总是增加 i 时,为什么要使用 else 并在每个块中增加 i?您可能想查看range 并了解elifs's

标签: python arrays algorithm


【解决方案1】:

你的问题是因为当你这样做时 -

ans=subans

您只是将 subans 的引用存储到 ans ,当您在 subans 中更改某些内容时,这些更改也会反映在 ans 中(因为它们是相同的引用)。

您需要将subans 的副本存储在ans 中,而不是直接引用。

例子-

ans = []
subans = []
MSS,subsum,i = 0,0,0

while(i<L):
   subans.append(A[i])
   subsum = sum(subans)
   if(subsum<0):
       subans=[]
       i+=1
   else:
       print('subsum - ' + str(subsum))
       print('MSS - ' + str(MSS))
       if(subsum>MSS):
           MSS=subsum
           ans=list(subans) #more ways to do this, like subans[:] also works, and copy.copy(subans) , etc.
           i+=1
       else:
           i+=1

【讨论】:

  • 谢谢!那行得通。
  • subans[:] 什么时候不能工作,而list(subans) 可以工作?
  • 会的,我什么时候说不会了?我说like subans[:] may also work
  • may also work,你明白may的意思吗?
  • may 不是否定的,我只是在大多数地方使用may。你想让我重新措辞吗?
猜你喜欢
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2019-10-13
  • 2017-12-14
  • 1970-01-01
  • 2015-05-25
相关资源
最近更新 更多