Python 获取最大子阵列的开始时出现的问题
我正在尝试实现一种方法来获取maxSubArray和以及相关的开始和结束索引。作为参考,maxSubArray是所有子阵列中整数和最大的连续子阵列。我的总和正确,结束索引正确,但我在开始时遇到了麻烦。我已经解释了一个微不足道的案例,但无论我做什么,我似乎无法解释所有的案例。每当我解释一个,另一个就会出现。很明显,在线性时间内求和是可能的,但我似乎无法找到一种有效地获得正确起始索引的方法Python 获取最大子阵列的开始时出现的问题,python,algorithm,Python,Algorithm,我正在尝试实现一种方法来获取maxSubArray和以及相关的开始和结束索引。作为参考,maxSubArray是所有子阵列中整数和最大的连续子阵列。我的总和正确,结束索引正确,但我在开始时遇到了麻烦。我已经解释了一个微不足道的案例,但无论我做什么,我似乎无法解释所有的案例。每当我解释一个,另一个就会出现。很明显,在线性时间内求和是可能的,但我似乎无法找到一种有效地获得正确起始索引的方法 def maxSubArray(seq): #max_i = max ending at i, max
def maxSubArray(seq):
#max_i = max ending at i, max_gen = best max up until i
max_i = max_gen = beg = end = prev_max = 0
for i in xrange(len(seq)):
#use dynamic programming to get maxSubArray sum (works)
max_i = max(0, max_i + seq[i])
max_gen = max(max_gen, max_i)
#get correct end (works)
if prev_max < max_gen:
end = i
prev_max = max_gen
if max_gen == 0:
max_gen = max(seq)
beg = end = seq.index(max_gen)
return [max_gen, beg, end]
原谅我,但这是可行的,而且是蟒蛇式的
def maxSubArray(seq):
all_sum = cur_sum = 0
all_beg = cur_beg = 0
all_end = 0
for cur_end, x in enumerate(seq, 1):
if cur_sum + x > 0:
cur_sum += x
if all_sum < cur_sum:
all_sum = cur_sum
all_beg, all_end = cur_beg, cur_end
else:
cur_sum = 0
cur_beg = cur_end
return all_sum, all_beg, all_end
def最大子阵列(序列):
全部总和=当前总和=0
all_beg=cur_beg=0
全部结束=0
对于cur_end,枚举中的x(序号1):
如果cur_sum+x>0:
cur_sum+=x
如果所有总和<当前总和:
全部总和=当前总和
全部乞求,全部乞求=全部乞求,全部乞求
其他:
cur_sum=0
cur_beg=cur_end
归还所有金额、所有请求、所有结束
算法是一样的。在这里结束的数组(cur_
)和全局(all_
)都有总和、开始索引和结束索引
编辑:注意这里的结束索引是独占的
此外,如果有多个最优子阵列,则返回第一个和最长的子阵列。我似乎很熟悉这个问题。。。快速搜索发现了一篇维基百科文章。从C++解决方案中修改了< < /P> >
def maxSubArray(seq):
max_so_far = seq[0]
max_ending_here = 0
begin = 0
begin_temp = 0
end = 0
for i in xrange(1, len(seq)):
if max_ending_here < 0:
max_ending_here = seq[i]
begin_temp = i
else:
max_ending_here += seq[i]
if max_ending_here >= max_so_far:
max_so_far = max_ending_here
begin = begin_temp
end = i
return max_so_far, begin, end
def最大子阵列(序列):
最大迄今为止=序号[0]
此处的最大值=0
开始=0
开始温度=0
结束=0
对于x范围内的i(1,len(seq)):
如果此处的最大值小于0:
此处的最大值=序号[i]
开始_temp=i
其他:
此处的最大值+=序号[i]
如果max\u ending\u here>=max\u至今:
max\u so\u far=max\u ending\u此处
开始=开始温度
结束=i
返回到目前为止的最大值,开始,结束
我想到的唯一“好”方法是从最后一个
结尾返回,然后取总数,直到到达必须是开始的点,但我觉得应该有更好的方法来完成。谢谢。这正是我想要的。我有一些东西看起来非常相似,尽管稍微复杂一些,也不正确。谢谢你澄清。是的,算法实际上是一样的。嗯。。。没有在搜索结果中查找足够多的内容。也回答了。
def maxSubArray(seq):
max_so_far = seq[0]
max_ending_here = 0
begin = 0
begin_temp = 0
end = 0
for i in xrange(1, len(seq)):
if max_ending_here < 0:
max_ending_here = seq[i]
begin_temp = i
else:
max_ending_here += seq[i]
if max_ending_here >= max_so_far:
max_so_far = max_ending_here
begin = begin_temp
end = i
return max_so_far, begin, end