给出一个未排序的Integer数组及其值。 需要计算每对之间的距离乘法和它们之间的最大值。
更清楚。
让我们说数组A[] with n
元素
计算: -
for all i & j (i<j)
sum (distance(i,j)*(max(A[i],A[j])))
O(n ^ 2)很容易。我想要更好。 我努力了,但不知道使用什么数据结构。 我会要求只给出一个提示来解决这个问题(我会从那里尝试)
答案 0 :(得分:1)
为了简单起见,我假设所有数字都是不同的。
让我们从左到右迭代。让我们看看a[i]
并将其右端的所有细分添加到答案中。考虑所有j < i
。有两种可能的情况:
a[j] < a[i]
。我们需要在答案中添加a[i] * (i - j + 1)
。a[j] > a[i]
。我们需要添加a[j] * (i - j + 1)
。让我们重写这两个总和:第一个是
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)
解决方案。