1-n个数排成一个圆环,定义距离为相邻两个数差的平方,求距离的和最大时,圆环的排列。今天听同学说起了这一道题,这是某易算法工程师的一道笔试题,需要求最优的算法,拿到这道题以后的第一反应就是遍历,把所有的排列都列举出来算一遍,在网上搜索一番也没有原题,今年刚出的面试题,估计暂时也不会有答案。
网上找到的一个网友给的解法,就是用暴力的方法。先做出1~n的排列,由于是环形,可以把1固定,这样做2~n的排列就可以了。然后一一计算得到最大值。
import itertools
n = 7
max1 = 0
for i in itertools.permutations(range(2, n + 1), n - 1):
sum1 = 0
lst = list(i)
lst.insert(0, 1)
for j in range(len(lst)):
sum1 += (lst[j] - lst[(j + 1) % len(lst)]) ** 2
if sum1 > max1:
max1 = sum1
lst2 = lst[:]
print(lst2)
不过根据这个算法我们可以得到一些可优解,
n=7 解[1, 6, 3, 4, 5, 2, 7]
n=8 解[1, 7, 3, 5, 4, 6, 2, 8]
n=9 解[1, 8, 3, 6, 5, 4, 7, 2, 9]
n=10 解[1, 9, 3, 7, 5, 6, 4, 8, 2, 10]
发现最优解就是,隔一个就前后交换一个。
如果有更好的算法,欢迎留言。