【问题标题】:Maximise the given equation in less than O(n^2)在小于 O(n^2) 的时间内最大化给定方程
【发布时间】:2015-08-02 17:51:45
【问题描述】:

给定一个数组如何求最大值

    (ar[j]-ar[i]-1)*(min(ar[i],ar[j]))

时间 O(n) 或 O(nlogn)

【问题讨论】:

  • 为什么认为这是可能的?还有——是否对数字有任何限制,例如全部为正数?
  • 是的,数组的元素都是正数。这是以前的奥林匹克问题,因此可以做到。我忘记了几年前看到的解决方案。
  • 好吧——我没有强烈的直觉认为这是不可能的,但我不相信这是可能的。如果数字都是正数,那么-1 是多余的,因为表达式在同一对索引处最大化,这使表达式在删除负 1 的情况下最大化(至少在所有数字不相同的情况下)。我不确定这有什么帮助,但更简单的表达式通常更容易优化。

标签: algorithm adhoc


【解决方案1】:

如果输入总是非负数,那么除了ar 的最大元素之外,没有任何意义作为ar[j];任何不使用ar[j] 的产品都可以通过使用ar[j] 来增加。因此,我们可以在O(n)时间找到最大值,并在O(n)时间对ar[i]的所有可能值进行尝试以解决问题。

如果不要求输入为非负数,则最大乘积必须使用最大ar[j] 或最小ar[j]。同样,我们可以找到最大值和最小值,并针对所有可能的ar[i] 值进行尝试。

【讨论】:

  • 很抱歉,但我不确定在 O(n) 时间找到 i,因为它似乎需要乘法:en.m.wikipedia.org/wiki/…
  • @SamBurns:对我来说似乎很清楚我们假设的是恒定时间算术。如果我们不是,那么我们假设可变大小的整数,在这种情况下输入可能大于O(n^2)(其中n是输入元素的数量),我们不会有希望及时解决问题。无论如何,我们不需要乘法来找到i;对于固定的j,要最大化的表达式是一个简单的二次方。我们可以找到顶点一次并选择最接近该顶点的i
  • 是的,你完全正确。忽略我,改为执行以下操作:通过在O(n) 时间内遍历数组一次,为ar[j] 选择可能的最高值。然后找到最接近(ar[j] - 1)/2)ar[i] 的值,再次在O(n) 时间,为您的表达式在O(n) 时间总体上给出可能的最高值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2014-04-29
  • 2019-11-19
相关资源
最近更新 更多