使用O(n)变换计数在O(nlogn)中具有正和的连续子阵列的数量

时间:2014-09-16 05:05:07

标签: algorithm arrays

我感兴趣的是找到总和为正值的连续子阵列的数量(总和> 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)变换而不是替代(不是基于变换加反转计数)解决方案来寻找子阵列的数量。

1 个答案:

答案 0 :(得分:4)

使用原始数组A,构建另一个数组sumA,使得:

sumA[i] = A[0] + A[1] + ... + A[i].

现在在此sumA []数组中,如果存在两个索引i,j(i

然后sumA[j] - sumA[i] > 0。这正是索引i和j之间所有元素的总和。

因此,问题减少到找到该数组反转的反转次数。这可以通过使用mergesort按降序对数组sumA []进行排序并计算此过程中遇到的反转次数来进行。