给定数组 A ,以及两个索引 L 和 R ,找到
的值
Summation(AS[i]*AS[j]*AS[k])
其中L<=i<j<k<=R
成立,AS
是A
到L
范围内R
所有元素的有序集包容。
实施例:
让A=(4,4,1,6,1,3)
L=0
和R=3
给出AS=(1,4,6)
,Ans=1*4*6=24
我没有比O(n ^ 3)更好的方法,这非常慢。 请建议我一些更快的方法。
A中的元素数量最多为10 ^ 5。
答案 0 :(得分:2)
正如评论员所说的那样,确定AS
可以通过使用哈希表H
来完成。您只需将A
的元素从索引L
迭代到R
,然后将每个元素插入H
。结果应该是您需要的元素集。您仍然需要对集合进行排序。为此,您可以将H
的元素复制到一个数组中并对该数组进行排序。结果是AS
。这不应超过O(NlogN)
步骤,其中N=R-L
。
评论员没有说的是如何有效地计算总和。它可以在O(N)
步骤中完成。这是如何。
我们首先进行以下观察:
Sum(AS[j]*AS[k], a <= j < k <= b) =
1/2*(AS[a] + AS[a+1] + ... + AS[b])^2 -
1/2*(AS[a]^2 + AS[a+1]^2 + ... + AS[b]^2)
我们按目标扩展目标金额:
S = Sum(AS[i]*AS[j]*AS[k]) =
AS[L] * Sum(AS[j]*AS[k], L+1 <= j < k <= R) + (iteration 1)
AS[L+1] * Sum(AS[j]*AS[k], L+2 <= j < k <= R) + (iteration 2)
...
AS[R-2] * Sum(AS[j]*AS[k], R-1 <= j < k <= R). (iteration R-L-1)
我们现在应用观察。
要有效地确定格式Sum(AS[j]*AS[k], a <= j < k <= b)
的总和,我们可以先计算
S1 = AS[L] + AS[L+1] + ... + A[R]
S2 = AS[L]^2 + AS[L+1]^2 + ... + A[R]^2
然后逐步从每个和中减去第一项,因为我们将AS
的元素从索引L
迭代到R-2
。
因此,在确定O(N)
后,可以在AS
步骤中确定所需的总和。如果您使用某种比较排序方法,则整个算法应采用O(|A|) + O(NlogN) + O(N)
步骤。