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

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

相關文章
相關標籤/搜索