0

给定一个长度为 n 的数组,带有整数(可以是负数或正数)。找到总和最小的子数组的开始和结束索引。

4

1 回答 1

1

正如您所指定的,这是关于 Kadanes 算法的,很容易找到很多关于它的参考资料。GeeksForGeeks :最小和连续子数组友好地解释了算法并提供了几种语言的实现。

基于该页面中的代码,我将其修改为返回开始/结束索引而不是总和值。这个想法是保持范围索引和总和值。

import sys

def smallestSumSubarr(arr, n):
    min_ending_here = sys.maxint
    min_so_far = sys.maxint
    min_so_far_range = (-1, 0) # save indices

    for i in range(n):
        if (min_ending_here > 0):
            min_ending_here = arr[i]
            min_ending_here_range = (i, i) # start over
        else:
            min_ending_here += arr[i]
            min_ending_here_range = (min_so_far_range[0], i) # extend the range

        if min_so_far > min_ending_here: # update both value and range
            min_so_far = min_ending_here
            min_so_far_range = min_ending_here_range

    return min_so_far_range # return range instead of value


# Usage
arr = [3, -4, 2, -3, -1, 7, -5]
n = len(arr)
print "Smallest sum range(inclusive): ", smallestSumSubarr(arr, n)

在 STDOUT 上,您将看到

Smallest sum range(inclusive):  (1, 4)
于 2019-02-22T06:54:58.200 回答