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

猜你喜欢

转载自blog.csdn.net/Neekity/article/details/84656049