交换两等长整型数列元素使其之间差值最小

题目:有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
解题思路:

  1. 将两个list整合排序.
  2. 定义两个空列表larger smaller每次依次从sorted list里面取出两个元素,通过判断当前两个list的大小(sum(larger) 与 sum(smaller))将元素中较大放入较小的list中.
  3. larger中的每个元素依次与smaller中的每个元素比较,如果larger[i] > smaller[j] 并且0< larger[i] - smaller[j] < sum(larger) - sum(smaller), 则交换两元素.

code:

def first_swap(sorted_list):
    larger, smaller = [], []
    for i in range(0, len(sorted_list) - 1, 2):
        if sum(larger) - sum(smaller) > 0:
            larger.append(sorted_list[i])
            smaller.append(sorted_list[i + 1])
        else:
            larger.append(sorted_list[i + 1])
            smaller.append(sorted_list[i])

    return (larger, smaller) if sum(larger) - sum(smaller) > 0\
        else (smaller, larger)


def final_swap(larger, smaller):
    d = sum(larger) - sum(smaller)
    for i in range(len(larger)):
        for j in range(len(smaller)):
            itd = larger[i] - smaller[j]
            if d > itd > 0:
                larger[i], smaller[j] = smaller[j], larger[i]
                d = sum(larger) - sum(smaller)
    return larger, smaller

if __name__ == "__main__":
    l3 = [1, 1, 2, 3, 29, 18]
    l4 = [30, 210, 232, 12311, 12312, 1]
    sorted_list = sorted(l3 + l4)
    l1, l2 = first_swap(sorted_list)
    print "The result of the fist swap:"
    print l1
    print l2
    print "Difference value of the fist swap: %d" % (sum(l1) - sum(l2))
    l1, l2 = final_swap(l1, l2)
    print "\nThe result of final swap:"
    print l1
    print l2
    print "Difference value: %d" % (sum(l1) - sum(l2))

输出结果:

The result of the fist swap:
[1, 2, 3, 30, 232, 12311]
[1, 1, 18, 29, 210, 12312]
Difference value of the fist swap: 8

The result of final swap:
[1, 1, 1, 29, 232, 12311]
[3, 2, 18, 30, 210, 12312]
Difference value: 0

输出的结果没问题,但是总感觉final_swap又哪里不妥,但是我又看不出来哪里不妥[哭笑脸]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值