计算来自数组的连续子数组的和数


12

我们给出阵列与所有一个[ ] > 0a[1n]a[i]>0

现在我们需要找到可以从其子数组中形成多少个不同的总和(其中,子数组是该数组的连续范围,即,对于某些j k的,总和是所有子数组的元素)。例如,如果一个= [ 1 2 1 ],则答案为4:我们可以形成1 2 3 4a[jk]j,ka=[1,2,1]1,2,3,4

我知道如何计算时间中不同总和的数量。O(n2)

此外,我已经意识到这与经典问题类似,在经典问题中,我们需要找到字符串的不同子字符串的数量。我正在考虑构造后缀数组并以类似的方式(以时间)解决它的可能性。但是我还无法弄清楚如何对其进行修改以在这里工作。例如,如果我们使用后缀数组为一个= [ 1 2 1 ],我们将得到5案件代替的四个上可接受的那些。是否可以使用后缀数组来做到这一点,或者我在想错方向吗?O(n)a=[1,2,1]

我也一直在思考另一个方向。分而治之。就像我每次将数组分为两部分,直到将其简化为单个元素一样。一个元素可以有一个总和。现在,如果我们组合两个单个元素,则可以通过两种方式完成:如果两个单个范围具有相同的元素,那么我们将获得2个不同的和,或者如果两个具有不同的元素,我们将获得3个不同的和。但是对于合并长度大于1的数组,我无法一概而论。是否可以合并两个m个大小的数组,并以得出答案?O(m)


O(n lg n)

我建议从以下问题开始:决定两个间隔的和是否相同有多难?试图证明此问题的3SUM难度很诱人,但到目前为止,我还没有能够做到。
Yuval Filmus 2014年

Answers:


2

O(n2)Θ(n2)

[1,2,4,8,,2n]n(n+1)2


“几乎可以肯定”是由于这样的事实,即问题不需要将总和的值作为输出。但是,我认为如果没有确定至少大多数值,就无法避免重复。


我认为没有特别的原因,为什么不应该有办法避免在仍然给出正确答案的情况下避免所有可能性。动态编程算法会按常规执行此操作。
Yuval Filmus,2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.