问题是要求获取任意数量的数字,并在连续数字之间找到最大可能的差异总和(使用绝对值)。例如,数字1 2和3将被排列为3 1 2以获得3的总和(3-1 = 2,并且1-2 = 1)。
现在我的第一个想法是采用列表中最高的数字,然后是最低的数字,并以此方式安排到最后,但这不会有效,因为列表的末尾最终会包含所有数字中间积累几乎没有差异。我想到的唯一另一件事是找到每一个可能的顺序并返回最高的总和,但是如果列表更长,这将花费太长时间,我认为可能有更好的方法。
这里有一些参考输入和输出数字
9 2 5 3 1 -> 21
7 3 4 5 5 7 6 8 5 4 -> 24
任何帮助都会非常感激,即使它只是指向我正确的方向。
答案 0 :(得分:3)
这个问题有两种方法。
方法1:
蛮力。方法2:
找出如何排列数字的算法。
如果可行,我总是更喜欢方法2。
如果你订购数字高 - 低 - 高 - 低 - 高,你会获得高额金额似乎是合理的......
首先,对数字进行排序,然后将它们分成两个同样大的低数字和高数字组。如果有一个奇数个数字,中间的数字将被遗留下来。
然后你只需从两组中交替选择数字。
只要你坚持使用高 - 低 - 高 - 低顺序,很容易证明内部数字的顺序并不重要。 但是,由于起始和结束编号只有一个邻居,因此第一个和最后一个数字应该是中间数字。
最后,如果你有一个奇数的数字,把最后一个数字放在开头或结尾,无论什么给出最大的差异。
示例:
7 3 4 5 5 7 6 8 5 4 -> [sort] -> 3 4 4 5 5 5 6 7 7 8
high numbers: 5 6 7 7 8
low numbers: 3 4 4 5 5
Arranged:
5 3 6 4 7 4 7 5 8 5 = 24
示例:
9 2 5 3 1 -> [sort] -> 1 2 3 5 9
high numbers: 5 9
low numbers: 1 2
left over: 3
Arranged:
3 5 1 9 2 = 21 (3 goes at the start, because |3-5| > |3-2|)