python中交换a和b的值_交换A和B之间的元素以获得和相等

如果有这样的互换,那么两个值之间的差值必须是总和差的一半。交换两个值意味着两个列表的总和将改变,一个上升,另一个下降,以相同的数量。这两个变化必须加上掉期前的和之间的差值,且两个总和都会以相同的值(^{cd1>}和^{cd2>}或值delta(这是两个交换值之间的差异)而变化。

首先,函数将^{{cd3>}计算为总和和和和之间的δ。注意^{cd4>}可能大于^{cd5>},此时结果^{cd6>}为负值。这只意味着^{cd7>}中必须有一个小于^{{cd8>}中的目标值的值,然后交换将减少^{{cd4>}并增加^{cd5>}使它们相等。如果总和增量的奇偶性是odd而不是偶数,则永远找不到值delta是总和增量的一半,因此函数此时返回^{{cd11>}。^{cd3>}的最终值是值delta,两个交换值之间的差值量。记住,值delta是总和的一半。

算法计算^{{cd8>}中的所有值,然后测试^{{cd7>}中的所有值。只有当^{cd7>}中的^{em>a值与^{cd8>}中的aaa值不同时,才可能在^{cd8>}和^{cd7>}之间交换两个值。与^{cd7>}交换的^{cd8>}中的值需要等于^{{cd22>}。对于一个负^{cd3>}(^{cd24>}),如果一个正^{cd3>}的数值越大,它会使^{cd25>}变小。

^{cd28>}测试将查看^{{cd29>}中是否有可用的值,但它首先测试^{{cd22>}仍在[0-m]:0 <= B[i] - d测试A中所寻求的数字是否仍然为正数。

^{cd33>}如果所寻求的数字仍然不大于^{cd34>};如果^{{cd35>}关闭,^{{cd3>}为负值,则可能会发生测试。

^{cd37>}包含^{{cd8>};如果^{{cd39>}中的数字计数为true,则A中至少有一个这样的数字。这是一个可以交换的数字。

需要进行范围测试,因为^{{cd40>}列表仅保留从0到m(包括)的数字的计数,而不是负数或大于^{{cd34>}的数字。

该函数可以通过使用集合而不是计数函数来改进。没有必要知道数字在^{cd8>}中出现多少次,只是它存在存在。这将使边界检查过时,因为超出界限的数字将不会出现在^{{cd8>}的一组值中。

一旦我们有了一组a的值,我们就可以使用^{}测试这个集是否来自应用了delta的b值集的disjoint:def faster_solution(A, B, m=None): # m is ignored in this version

delta = sum(A) - sum(B)

if delta % 2 == 1:

return False

delta //= 2

return not set(A).isdisjoint(b - delta for b in B)

如果^{cd8>}中的值等于^{{cd7>}中的a值减去δ,则返回True。Python只会在^{cd47>}循环上循环,直到找到匹配(此时集合不是不相交的,并且^{cd48>}将结果反转为True),或者循环已用尽,因此在^{cd8>}中找不到此类值,并且发现这些集合是不相交的。

所示的^{cd50>}函数还有另一个问题:它需要的内存远远超过所需的内存,而且与在进行计数时实现优化循环的^{} object相比,它的速度非常慢。A^{cd52>}使用字典(哈希映射)仅存储大于0的计数。

上述设置的解决方案击败了“快速解决方案”的手:

^{pr2}$

不使用计数器,并且使用Python的set功能使长度为1000的输入速度快了17倍!

故事的寓意:使用你所选择的语言中可用的最好工具,并批判性地思考解决问题所需要的实际需要他有问题。Python内置的类型和操作通常可以让您避免在Python字节码中运行关键循环,从而显著减少算法的恒定时间因子。在

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值