整数数组中每对的距离和最大值的乘积之和

时间:2016-12-16 16:26:32

标签: arrays algorithm data-structures

给出一个未排序的Integer数组及其值。 需要计算每对之间的距离乘法和它们之间的最大值。

更清楚。 让我们说数组A[] with n元素

计算: -

for all i & j (i<j)
sum (distance(i,j)*(max(A[i],A[j])))

O(n ^ 2)很容易。我想要更好。 我努力了,但不知道使用什么数据结构。 我会要求只给出一个提示来解决这个问题(我会从那里尝试)

1 个答案:

答案 0 :(得分:1)

为了简单起见,我假设所有数字都是不同的。

让我们从左到右迭代。让我们看看a[i]并将其右端的所有细分添加到答案中。考虑所有j < i。有两种可能的情况:

  1. a[j] < a[i]。我们需要在答案中添加a[i] * (i - j + 1)
  2. a[j] > a[i]。我们需要添加a[j] * (i - j + 1)
  3. 让我们重写这两个总和:第一个是 sum j < i and a[j] < a[i] of a[i] * (i - j + 1) = (a[i] * (i + 1) * number of such j) - (a[i] * (sum j < i and a[j] < a[i] of j))。请注意,a[i] * (i + 1)a[i]独立于j,因此它只是一个常量。我们只需要有效计算j及其总和j < i and a[j] < a[i]的数量。实际上,它是前缀的总和。平衡的二叉搜索树可以处理,但我们不需要它。我们可以压缩坐标并使用二进制索引树。现在我们可以在O(N log N)中计算这个总和。

    您可以使用第二笔来做类似的事情来获得O(N log N)解决方案。