Algorithm 在小于O(n^2)的时间内使给定方程最大化

Algorithm 在小于O(n^2)的时间内使给定方程最大化,algorithm,adhoc,Algorithm,Adhoc,给定一个数组,如何找到 (ar[j]-ar[i]-1)*(min(ar[i],ar[j])) 在时间O(n)或O(nlogn)中,如果输入总是非负的,那么除了使用ar的最大元素作为ar[j]之外,没有任何意义;使用ar[j]可以增加任何不使用ar[j]的产品。因此,我们可以在O(n)time中找到最大值,并将其与ar[i]inO(n)time中的所有可能值进行比较,以解决问题 如果不要求输入为非负,则最大乘积必须使用最大值ar[j]或最小值ar[j]。同样,我们可以找到最大值和最小值,

给定一个数组,如何找到

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

在时间O(n)或O(nlogn)

中,如果输入总是非负的,那么除了使用
ar
的最大元素作为
ar[j]
之外,没有任何意义;使用
ar[j]
可以增加任何不使用
ar[j]
的产品。因此,我们可以在
O(n)
time中找到最大值,并将其与
ar[i]
in
O(n)
time中的所有可能值进行比较,以解决问题


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

为什么认为这是可能的?另外--对数字是否有任何限制,例如都是正数?是的,数组的元素都是正数。这是前一个奥运会的问题,因此有可能做到。我忘记了几年前看到的解决方案。好吧——我没有强烈的直觉认为这是不可能的,但我不相信这是可能的。如果数字都是正数,则
-1
是多余的,因为表达式在相同的索引对上最大化,该索引对表达式进行最大化,同时删除负数1(至少如果所有数字都不相同)。我不确定这有什么帮助,但简单的表达式通常更容易优化。很抱歉,我不确定在
O(n)
时间中查找
I
,因为它似乎需要乘法:@SamBurns:我很清楚,我们假设的是常数时间算术。如果不是,那么我们假设的是可变大小的整数,在这种情况下,输入可能大于O(n^2)(其中n是输入元素的数量),我们就没有希望及时解决这个问题。无论如何,我们不需要乘法来找到
i
;对于固定的
j
,要最大化的表达式是一个简单的二次表达式。我们可以找到一次顶点,然后选择离它最近的
i
。是的,你完全正确。忽略我,改为这样做:通过在
O(n)
时间内迭代数组一次,为
ar[j]
选择尽可能高的值。然后在
O(n)
时间中再次找到最接近
(ar[j]-1)/2)
ar[i]
值,为
O(n)
时间中的表达式提供可能的最高值。