给出一个长度为n的数组,该数组带有整数(可以是负数或正数)。找到子数组的开始和结束索引,并尽可能减少总和。
答案 0 :(得分:0)
正如您所指定的,这是关于Kadanes算法的,很容易找到很多有关它的参考。 GeeksForGeeks : Smallest sum contiguous subarray请对该算法进行解释,并提供几种语言的实现。
基于该页面上的python代码,我对其进行了修改,以返回开始/结束索引而不是总和值。这个想法是保持范围索引和总和值。
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)