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

标签 arrays algorithm data-structures

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

更清楚。 假设数组 A[] 有 n 元素

计算:-

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

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

最佳答案

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

让我们从左到右迭代。我们来看看a[i]并将所有正确结束的部分添加到答案中。考虑所有 j < i .有两种可能的情况:

  1. a[j] < a[i] .我们需要添加 a[i] * (i - j + 1)到答案。
  2. 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 ,所以它只是一个常数。我们只需要计算这样的数量 jj < i and a[j] < a[i]和他们的总和有效。事实上,它是一个前缀的总和。平衡二叉搜索树可以处理这个问题,但我们不需要它。我们可以压缩坐标并改用二叉索引树。现在我们可以在 O(N log N) 中计算这个总和.

您可以对第二个总和做类似的事情以获得 O(N log N)解决方案。

关于arrays - 整数数组中每对的距离与最大值的乘积之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41188595/

相关文章:

java - 使用多线程在数组中查找质数

c# - 绘制边缘方向的算法

c - 如何将文件中的数据分配给数据结构

arrays - 如何在函数中取消嵌套数组?

javascript - 修改对象数组中的对象值

c - Mac 上连接字符集时出现总线错误 10

algorithm - rand 在 perl 中的工作

c++ - 如何在左子右兄弟树中找到节点的父节点?

c# - 在C#中设置允许快速插入/删除和随机选择

java - 将字符转换为大写而不改变原始数组