Given an array of N positive integers. It can have n*(n+1)/2
sub-arrays including single element sub-arrays. Each sub-array has a sum S
. Find S's
for all sub-arrays is obviously O(n^2)
as number of sub-arrays are O(n^2)
. Many sums S's
may be repeated also. Is there any way to find count of all distinct sum (not the exact values of sums but only count) in O(n logn)
.
I tried an approach but stuck on the way. I iterated the array from index 1 to n.
Say a[i]
is the given array. For each index i
, a[i]
will add to all the sums in which a[i-1]
is involved and will include itself also as individual element. But duplicate will emerge if among sums in which a[i-1]
is involved, the difference of two sums is a[i]
. I mean that, say sums Sp
and Sq
end up at a[i-1]
and difference of both is a[i]
. Then Sp + a[i]
equals Sq
, giving Sq
as a duplicate.
Say C[i]
is count of the distinct sums in which end up at a[i]
.
So C[i] = C[i-1] + 1 - numbers of pairs of sums in which a[i-1] is involved whose difference is a[i]
.
But problem is to find the part of number of pairs in O(log n)
. Please give me some hint about this or if I am on wrong way and completely different approach is required problem point that out.
When S is not too large, we can count the distinct sums with one (fast) polynomial multiplication. When S is larger, N is hopefully small enough to use a quadratic algorithm.
Let x_1, x_2, ..., x_n be the array elements. Let y_0 = 0 and y_i = x_1 + x_2 + ... + x_i. Let P(z) = z^{y_0} + z^{y_1} + ... + z^{y_n}. Compute the product of polynomials P(z) * P(z^{-1}); the coefficient of z^k with k > 0 is nonzero if and only if k is a sub-array sum, so we just have to read off the number of nonzero coefficients of positive powers. The powers of z, moreover, range from -S to S, so the multiplication takes time on the order of S log S.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With