返回错误输出的最大和子数组
Posted
技术标签:
【中文标题】返回错误输出的最大和子数组【英文标题】:Maximum sum subarray returning wrong output 【发布时间】:2017-11-05 20:52:52 【问题描述】:算法看起来正确,但无法找出错误所在。从 8 到 10 返回的代码是最大子数组,共 32 个。但实际答案是 8 到 11,共 43 个。
import sys
import math
def maxtuple(lss,rss):
if lss[2] > rss[2]:
return lss
else:
return rss
def crosssubarray(A, start, mid, end):
ls=rs=-sys.maxsize
maxleft=0
maxright=0
sum = 0;
for i in reversed(range(start, mid)):
sum = sum + A[i]
print(i)
if sum > ls:
ls = sum
maxleft = i
sum = 0
for i in range(mid+1, end):
sum = sum+ A[i]
if sum > rs:
rs = sum
maxright = i
return (maxleft, maxright, ls+rs)
def maxsubarray(A,start,end):
if start == end:
return (start,end,A[start])
else:
mid = (start+end)/2
lss = maxsubarray(A, start, mid)
rss = maxsubarray(A, mid+1, end)
css = crosssubarray(A, start, mid, end)
maxsub = maxtuple(lss,rss)
maxall = maxtuple(maxsub, css)
return maxall`enter code here`
A = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
print(maxsubarray(A,0,15))
【问题讨论】:
抱歉,实际输出应该是 7 到 10 共 43 个 【参考方案1】:问题是 range(start, mid) 产生 start,start+1,..,mid-1 但不包括 mid。
这意味着您的交叉子数组不包含中间值。
改为尝试:
for i in reversed(range(start, mid+1)):
【讨论】:
以上是关于返回错误输出的最大和子数组的主要内容,如果未能解决你的问题,请参考以下文章