1. 程式人生 > >python leetcode 421. Maximum XOR of Two Numbers in an Array

python leetcode 421. Maximum XOR of Two Numbers in an Array

通過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’

  1. 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
  2. bit=3
    mask=11000
    prefixSet={0,8,24}
    guess=16|8=24
    prefix=0時 prefix^guess=24 res=24
    對照著上面的二進位制是不是能找到兩個異或後第4bit,3bit上為11
  3. 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
  4. bit=1
    mask=11110
    prefixSet={2,8,10,24,26}
    guess=24|2=26
    就是能取到第4bit,3bit,2bit,1bit上1101
    經過迴圈判斷後能取到 所以res=26
  5. 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