SC
def mean(sorted_list):
"""
题目:将一个序列分成两个子序列,确保两者之间的差值最小
实现:
1. 对列表排序
2. 递归列表:取出-1位置元素作为big,-2 位置元素作为small,
从前到后,切到-2位置(不包括)
3. 递归结束条件:传入的参数为空,开始递归退层
4. 一个大列表b_list,和一个小列表a_list,分别用来存放小元素和大元素
5. 对比大列表和小列表的总和,调换两者的位置
缺点:
1. 序列长度只能是偶数
2. 贪心算法,只能保证局部最优
:param sorted_list:
:return:
"""
if not sorted_list:
return [], []
if len(sorted_list) < 2:
small = False
else:
small = sorted_list[-2]
big = sorted_list[-1]
b_list, s_list = mean(sorted_list[:-2])
if small != False:
b_list.append(small)
s_list.append(big)
b_list_sum = sum(b_list)
s_list_sum = sum(s_list)
if b_list_sum > s_list_sum:
return b_list, s_list
else:
return s_list, b_list
# tests = [[1, 2, 3, 4, 5, 6, 700, 800], [10001, 10000, 100, 90, 50, 1], list(range(1, 11)),
# ]
tests = [[12312, 12311, 232, 210, 30, 29, 3, 2, 1, 1, 20]]
for test in tests:
test.sort()
print('source list:\t', test)
l1, l2 = mean(test)
print('result list:', l1, l2)
print('distance', abs(sum(l1) - sum(l2)))
print('*' * 23)
输出