一尘不染

整数数组的最大子数组

algorithm

在一次采访中,我的一位朋友被要求找到最大和的数组的子数组,这是我对问题的解决方案,如何改善解决方案使其更优化,我是否应该考虑以递归方式进行?

def get_max_sum_subset(x):
        max_subset_sum = 0
        max_subset_i = 0
        max_subset_j = 0
        for i in range(0,len(x)+1):
            for j in range(i+1,len(x)+1):
                current_sum = sum(x[i:j])
                if current_sum > max_subset_sum:
                    max_subset_sum = current_sum
                    max_subset_i = i
                    max_subset_j = j
        return max_subset_sum,max_subset_i,max_subset_j

阅读 180

收藏
2020-07-28

共1个答案

一尘不染

您的解决方案是O(n ^ 2)。最佳解决方案是线性的。它的工作原理是使您从左到右扫描数组,并记下最佳和和当前和:

def get_max_sum_subset(x):
    bestSoFar = 0
    bestNow = 0
    bestStartIndexSoFar = -1
    bestStopIndexSoFar = -1
    bestStartIndexNow = -1
    for i in xrange(len(x)):
        value = bestNow + x[i]
        if value > 0:
            if bestNow == 0:
                bestStartIndexNow = i
            bestNow = value
        else:
            bestNow = 0

        if bestNow > bestSoFar:
            bestSoFar = bestNow
            bestStopIndexSoFar = i
            bestStartIndexSoFar = bestStartIndexNow

    return bestSoFar, bestStartIndexSoFar, bestStopIndexSoFar

在“ PearsPearls:算法设计技术”(强烈推荐)中也对这个问题进行了详尽的讨论。在这里您还可以找到一个递归解,它不是最优的(O(nlog n)),但是比O(n ^ 2)好。

2020-07-28