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
若是有更好的算法,歡迎留言。搜索