algorithm - 查找给定数组中 L 到 R 范围内的值

标签 algorithm number-theory

给定数组A,以及两个索引LR,求出

的值

Summation(AS[i]*AS[j]*AS[k])

哪里L<=i<j<k<=R成立,并且ASA 的所有元素的排序集在范围内 LR包容性。

示例: 让A=(4,4,1,6,1,3) L=0R=3给出AS=(1,4,6) ,所以Ans=1*4*6=24

我没有任何比 O(n^3) 更好的方法,它非常慢。 请建议我一些更快的方法。

A 中的元素数量最多为 10^5。

最佳答案

正如问题评论员所说,确定AS可以通过使用哈希表 H 来完成。您只需迭代 A 的元素即可来自索引 LR然后将每个元素插入 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 的元素时,从每个总和中逐渐减去第一项来自索引 LR-2 .

因此,可以在O(N)中确定您想要的总和。确定 AS 后的步骤。假设您使用某种比较排序方法,整个算法应采用 O(|A|) + O(NlogN) + O(N)步骤。

关于algorithm - 查找给定数组中 L 到 R 范围内的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32027394/

相关文章:

c++ - euclid 的扩展算法 C++

algorithm - session 调度解决方案

algorithm - 方阵中的最小矩形曲面 - 算法

python - 最小化组数,其中组元素的总和低于特定值

c++ - 求 2 个五边形数,其和和差产生五边形数

java - 如何有效地找到 p 是质数的 gcd(a,b) % p?

python - 在python中使用in运算符搜索列表时使用什么算法?

c - 在c中求gcd的欧几里得程序

c++ - 反模的奇怪行为

python - 使用高斯(复数)整数生成毕达哥拉斯三元组