在python

时间:2019-07-14 07:20:50

标签: python sub-array

我尝试从给定的子数组中查找包含比任何其他子数组最大和的元素的子数组。

以下功能的参数为输入a,需要返回输出。可以有多个子数组,因为它们的最大和可以相等。该代码似乎没有按预期工作。

def max_sum_subarray(a):
        N, sub_sum, max_sum, subArrays = len(a), 0, 0, {}
        p,q=0,0    #starting and ending indices of a max sub arr

        for i in range(N):
            q=i
            sub_sum+=a[i]

            if(a[i]<0):
                q-=1
                if(sub_sum>=max_sum):
                    if(sub_sum>max_sum):
                        subArrays.clear()
                        subArrays[sub_sum]=[(p,q)]
                    else:
                        subArrays[sub_sum].append((p,q))

                sub_sum=0
                p=i+1

        if(sub_sum>=max_sum):
            if(sub_sum>max_sum):
                subArrays.clear()
                subArrays[sub_sum]=[(p,q)]
            else:
                subArrays[sub_sum].append((p,q))
        return(subArrays[p:q+1])


当我尝试运行输入

a=[ 1, 2, 5, -7, 2, 5 ]

预期的输出为[1, 2, 5],但给出的却是[2, 5]。有人可以在python中发布解决方案吗?

2 个答案:

答案 0 :(得分:2)

看来您使这项工作变得不必要了。您只需跟踪可看到的最大数组以及您要推入的当前数组即可,您实际上不需要关心其他任何事情。当您遇到负数(或数组末尾)时,请确定当前值是否应为新的最大值:

def maxSub(a):
    max_so_far = []
    max_sum = 0
    cur = []
    for n in a:
        if n >= 0:
            cur.append(n)
        else:
            cur_sum = sum(cur)
            if cur_sum > max_sum:
                max_sum = cur_sum
                max_so_far = cur
            cur = []

    return max([max_so_far, cur], key = sum)


a=[ 1, 2, 5, -7, 2, 5 ]

maxSub(a)
# [1, 2, 5]

当然,itertools.groupby使其成为了单线:

from itertools import groupby

a=[ 1, 2, 5, -7, 2, 5 ]
max([list(g) for k,g in groupby(a, key=lambda x: x>0) if k == True], key=sum)

答案 1 :(得分:0)

对于以下条件:

<块引用>

NOTE 1:如果有平局,则比较段的长度和 返回长度最大的段

注意 2:如果仍然有平局,则返回具有最小值的段 起始索引

这是我在 python 中的工作代码:

def check(max_arr,curr):
    if sum(curr) > sum(max_arr):
        max_arr = curr
    elif sum(curr) == sum(max_arr):
        if len(curr) > len(max_arr):
            max_arr = curr
        elif len(curr) == len(max_arr):
            if max_arr and (curr[0] > max_arr[0]):
                max_arr = curr
    return max_arr

def maxset(A):
    curr = []
    max_arr = []
    for i in A:
        if i >= 0:
            curr.append(i)
        else:
            max_arr = check(max_arr,curr)
            curr = []
    max_arr = check(max_arr,curr)                    
    return max_arr