Python 获取最大子阵列的开始时出现的问题

Python 获取最大子阵列的开始时出现的问题,python,algorithm,Python,Algorithm,我正在尝试实现一种方法来获取maxSubArray和以及相关的开始和结束索引。作为参考,maxSubArray是所有子阵列中整数和最大的连续子阵列。我的总和正确,结束索引正确,但我在开始时遇到了麻烦。我已经解释了一个微不足道的案例,但无论我做什么,我似乎无法解释所有的案例。每当我解释一个,另一个就会出现。很明显,在线性时间内求和是可能的,但我似乎无法找到一种有效地获得正确起始索引的方法 def maxSubArray(seq): #max_i = max ending at i, max

我正在尝试实现一种方法来获取maxSubArray和以及相关的开始和结束索引。作为参考,maxSubArray是所有子阵列中整数和最大的连续子阵列。我的总和正确,结束索引正确,但我在开始时遇到了麻烦。我已经解释了一个微不足道的案例,但无论我做什么,我似乎无法解释所有的案例。每当我解释一个,另一个就会出现。很明显,在线性时间内求和是可能的,但我似乎无法找到一种有效地获得正确起始索引的方法

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