您可以尝试次优贪心算法:
1. sortedArr <- sort input array
2. resultArr <- initialize empty array
3. for i=0 to size of sortedArr
a. if i%2
I. resultArr[i] = sortedArr[i/2]
b. else
II. resultArr[i] = sortedArr[sortedArr.size - (i+1)/2]
这会将数字从排序输入的左侧和右侧交替放入结果中。例如,如果排序后的输入是:
12, 12, 44, 63, 112, 221, 334, 842
那么输出将是:
12, 842, 12, 334, 44, 221, 63, 112
这可能不是最优的,但它可能非常接近并且在 O(nlogn) 中工作。在您的示例中,最佳值是通过以下方式获得的:
63, 221, 12, 334, 12, 842, 44, 112
得出的总和为 2707。我的算法得出的总和为 2656。我很确定您将无法在多项式时间内找到最优值。
Python 中的蛮力解决方案如下所示:
import itertools
maxSum = 0
maxl = []
for l in itertools.permutations([221,44,12,334,63,842,112,12]):
sum = 0
for i in range(len(l)-1):
sum += abs(l[i]-l[i+1])
if sum > maxSum:
print maxSum
print maxl
maxSum = sum
maxl = l
print maxSum
print maxl