我尝试写了一次代码,时间可以通过:
def perm(l):
if (len(l) <= 1):
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i + 1:]
p = perm(s)
for x in p:
r.append(l[i:i + 1] + x)
return r
def judge(nums:list):
result = 0
for index in range(len(nums)):
if index+1 == len(nums):
result += abs(int(nums[index]) - int(nums[0]))
else:
result += abs(int(nums[index]) - int(nums[index+1]))
return result
def main():
length = int(input())
nums = list(map(int, input().split(" ")))
result = perm(nums)
end = 0
for nums in result:
n = judge(nums)
if n > end:
end = n
print(end)
if __name__ == '__main__':
main();
但是内存占用过大:
应该怎么优化代码呢
perm()不要把所有排列结果都生成之后再一起返回,这样占用内存太多,应该加yield改为生成器,每次循环迭代时再生成一组排列结果
def perm(l): #加yield改为生成器
if (len(l) == 1):
yield [l[0]]
for i in range(len(l)):
s = l[:i] + l[i + 1:]
p = perm(s)
for x in p:
yield l[i:i + 1] + x
或者直接用现成的itertools.permutations()函数
import itertools
result = itertools.permutations(nums)
perm函数使用python自带的吧,你不可能比它自带的还要省空间
from itertools import permutations
# result = perm(nums)
result = permutations(nums)
另外你求绝对值之和的函数也可以优化
def judge(nums:list):
return sum(abs(x-y) for x,y in zip(nums,nums[-1:]+nums[:-1]))