1-n个数排成一个圆环,定义距离为相邻两个数差的平方,求距离的和最大时,圆环的排列。今天听同窗提及了这一道题,这是某易算法工程师的一道笔试题,须要求最优的算法,拿到这道题之后的第一反应就是遍历,把全部的排列都列举出来算一遍,在网上搜索一番也没有原题,今年刚出的面试题,估计暂时也不会有答案。python
网上找到的一个网友给的解法,就是用暴力的方法。先作出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]code
n=8 解[1, 7, 3, 5, 4, 6, 2, 8]it
n=9 解[1, 8, 3, 6, 5, 4, 7, 2, 9]io
n=10 解[1, 9, 3, 7, 5, 6, 4, 8, 2, 10]class
发现最优解就是,隔一个就先后交换一个。import
若是有更好的算法,欢迎留言。搜索