最大和子数组python

Posted

技术标签:

【中文标题】最大和子数组python【英文标题】:Maximum sum sub array python 【发布时间】:2019-11-20 07:57:38 【问题描述】:

我正在遵循“算法简介”一书并使用给出的算法来制作程序,但程序没有按预期工作。

可能先前函数的总和正在添加到新总和中,因此我不知道如何打印它。 当我放置一个元素列表时,输出是预期的,但是当我放置 2 个或更多元素列表时说 [2,3] 我得到的输出 4 不是预期的

def max_crossing_subarray(array,low,mid,high):
    left_sum = -1000
    sum_ar = 0

    for i in range(mid, low-1, -1):
        sum_ar = sum_ar + array[i]
        if sum_ar>left_sum:
            left_sum = sum_ar
            max_left = i

    right_sum = -1000
    sum_ar = 0

    for i in range(mid,high):
        sum_ar = sum_ar + array[i]
        if sum_ar>right_sum:
            right_sum = sum_ar
            max_right = i

    return [max_left, max_right, left_sum + right_sum]

def max_subarray(array, low, high):
    if low==high:
        return [low, high, array[low]]
    else:
        mid = int((low + high)/2)
        left_low, left_high, left_sum = max_subarray(array, low, mid)
        right_low, right_high, right_sum = max_subarray(array,mid+1,high)
        cross_low, cross_high, cross_sum = max_crossing_subarray(array, 
low, mid, high)

        if left_sum>=right_sum and left_sum>=cross_sum:
            return [left_low, left_high, left_sum]
        elif right_sum>=left_sum and right_sum>=cross_sum:
            return [right_low, right_high, right_sum]
        else:
            return [cross_low, cross_high, cross_sum]

arr = [2,3]
ar= max_subarray(arr, 0, len(arr)-1)
print(ar)

当我输入列表 [2] 时,我得到了输出 [0, 0, 2] #[low, high, sum] 但是对于 [2,3] 和 [2,5] 我分别得到了 [0, 0, 4] 和 [1, 1, 5] 的输出,这与预期的不同。

【问题讨论】:

是的,低和高是索引。正如我在问题中提到的,这是一个最大子数组问题。 【参考方案1】:

在计算最大交叉子数组时,第二个 for 语句范围应该从 mid + 1 开始并在 high + 1 结束。首先现在将中间元素添加到左右和,然后在最后一个元素之前完成求和一个。

【讨论】:

以上是关于最大和子数组python的主要内容,如果未能解决你的问题,请参考以下文章

返回错误输出的最大和子数组

如何找到[L,R]之间大小的最大和子数组

[算法导论]4.1-5最大连续子数组问题

最大和子数组 O(n) 不是 Kadane 的

求最大和子序列

华为机试真题 Python 实现等和子数组最小和2022.11 Q4新题