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內置的類型和操作通??梢宰屇苊庠赑ython字節碼中運行關鍵循環,從而顯著減少算法的恒定時間因子。在
總結
以上是生活随笔為你收集整理的python中交换a和b的值_交换A和B之间的元素以获得和相等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#list转JSON(Newtonso
- 下一篇: Python 快速入门