我感兴趣的是找到总和为正值的连续子阵列的数量(总和> 0)。
更正式地说,给定一个整数数组A [1,...,n]我希望计算整数对(i,j),使得1 <= i <= j <= n和A [ I] + ... + A [j]的&GT; 0
我熟悉Kadane的算法,用于在O(n)中找到最大和子子阵列,并且使用类似的方法,我可以计算O(n ^ 2)中这些子阵列的数量。
为此,我取累积和T(i)。然后,我为所有j = 1,...,n和i = 1,...,j计算T(j)-T(i-1),并记录最终为正的差异。
显然虽然有一个O(n)时间例程将这个问题转化为计算反转次数的问题(可以使用say merge-sort在O(nlogn)中实现)。尽管如此,我一直无法找到这种转变。
我确实理解尽管我必须将这种反转与一对(i,j)之间的元素之和为正的事实相匹配。
有没有人对如何做到这一点有任何指导?非常感谢任何帮助。
编辑:我实际上是在寻找O(n)变换而不是替代(不是基于变换加反转计数)解决方案来寻找子阵列的数量。
答案 0 :(得分:4)
使用原始数组A,构建另一个数组sumA,使得:
sumA[i] = A[0] + A[1] + ... + A[i].
现在在此sumA []数组中,如果存在两个索引i,j(i 然后 因此,问题减少到找到该数组反转的反转次数。这可以通过使用mergesort按降序对数组sumA []进行排序并计算此过程中遇到的反转次数来进行。sumA[j] - sumA[i] > 0
。这正是索引i和j之间所有元素的总和。