1-n个数排成一个圆环,定义距离为相邻两个数差的平方,求距离的和最大时,圆环的排列

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

若是有更好的算法,欢迎留言。搜索

相关文章
相关标签/搜索