数组中的最大绝对和

时间:2014-04-21 20:19:26

标签: java algorithm

我最近遇到过这个问题,但没有想到解决这个问题。你能帮助一些伪代码吗?

  

给定一个包含四个整数A,B,C,D的数组,按某种顺序对它们进行混洗。如果整数是唯一的,则有24次洗牌。我的任务是获得最好的洗牌,以便

F(S) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3])
     

是最大值

例如,考虑这个例子

A=5, B= 3, C=-1, D =5
s[0]=5, s[1]=-1, s[2]= 5, s[3] =3

会给我最大金额

F[s] =14

时间和空间复杂度为O(1)。

3 个答案:

答案 0 :(得分:4)

由于您的数组具有有界大小,因此您使用的终止任何算法将具有时间和空间复杂度O(1)。因此,简单的算法"尝试所有的排列,找到最好的一个"将在适当的时间范围内解决问题。我并不是说这是理想算法的任何想象力,但如果您需要的是在时间/空间O(1)中工作的东西,那么你&# 39;得到了答案。

希望这有帮助!

答案 1 :(得分:4)

算法

考虑按排序顺序列出您的积分:

A  B  C  D

设x为距离AB

设y是距离BC

设z为距离CD

总是得分最高的订单是BDAC,得分为2x + 3y + 2z。

实施例

在您的示例中,排序的点是:

A=-1 B= 3 C=5 D=5
x=4, y=2, z=0

因此,最佳订单将是BDAC = 3-> 5-> -1-> 5,得分为14。

提示证明

你可以证明这个结果只是考虑4点之间路径的所有排列,并用x,y,z计算得分。

e.g。

ABCD -> x+y+z
ACBD -> x+3y+z
ADBC -> x+3y+2z

等。

在任何排列中,分数最多使用x两次(因为A在末尾,所以路线只能到达或来自A两次)。类似地,z最多使用两次,因为D在最后。 y最多可以使用三次,因为添加了三件事。

排列BDAC使用x两次,z两次,y三次,因此永远不会被打败。

答案 2 :(得分:2)

如果数组已排序,此解决方案也可以运行:

F(S)= 2*abs(s[0]-s[3]) + abs(s[1]-s[2])

其中 s [0] = A s [1] = B s [2] = C s [3] = d