python leetcode 421. Maximum XOR of Two Numbers in an Array
阿新 • • 發佈:2018-12-01
通過mask來判斷最終結果在哪些bit上能取到1 核心公式a^b=c <---->a^c=b
以下是自己的理解
nums=[3, 10, 5, 25, 2, 8,26] 這裡因為最大數才25所以bit直接從4開始
3 ‘00011’
10 ‘01010’
5 ‘00101’
25 ‘11001’
2 ‘00010’
8 ‘01000’
26 ‘11010’
- bit=4
mask=10000
prefixSet存的是mask與操作nums的結果mask為{0,16}
guess 猜測最終結果這個bit=4上是否為1
for prefix in prefixSet:
if prefix^guess in prefixSet:
res=guess
break
這個迴圈判斷是關鍵當prefix=0時 prefix^guess=16(例如3與25的第四位的異或結果為16) 在 prefixSet中 res=guess(最終結果第四位上能取到1)
對照著上面的二進位制是不是能找到兩個異或後第4bit上為1 - bit=3
mask=11000
prefixSet={0,8,24}
guess=16|8=24
prefix=0時 prefix^guess=24 res=24
對照著上面的二進位制是不是能找到兩個異或後第4bit,3bit上為11 - bit=2
mask=11100
prefixSet={0,8,24}
guess=24|4=28
prefix=0時 prefix^guess=28
prefix=8時 prefix^guess=20
prefix=24時 prefix^guess=4 均不在prefixSet中
對照著上面的二進位制是不是找不到兩個數異或後第4bit,3bit,2bit上為111 所以只能為110 - bit=1
mask=11110
prefixSet={2,8,10,24,26}
guess=24|2=26
就是能取到第4bit,3bit,2bit,1bit上1101
經過迴圈判斷後能取到 所以res=26 - bit=0
mask=11111
prefixSet={2,3,8,10,24,25,26}
guess=26|1=27
就是能取到第4bit,3bit,2bit,1bit,0bit上11011
經過迴圈判斷後能取到 所以res=27
class Solution: def findMaximumXOR(self, nums): """ :type nums: List[int] :rtype: int """ mask=0 res=0 for bit in range(31,-1,-1): mask |= 1<<bit prefixSet={num&mask for num in nums} guess = res | 1<<bit for prefix in prefixSet: if prefix^guess in prefixSet: res=guess break return res